From 597ecfbc0249d83e1b856cbd558340c01237a360 Mon Sep 17 00:00:00 2001 From: Giulio Cesare Solaroli Date: Mon, 3 Oct 2011 00:52:40 +0100 Subject: [PATCH 1/3] Added project icon --- Icon.png | Bin 0 -> 23489 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Icon.png diff --git a/Icon.png b/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..985c41f81703f5633e1187736553fe08933c9010 GIT binary patch literal 23489 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 cE4SRkZZii--YKw`Ke Date: Mon, 3 Oct 2011 00:56:18 +0100 Subject: [PATCH 2/3] First version of the newly restructured repository --- .gitignore | 2 + LICENCE.txt | 661 ++ README.md | 57 + backend/php/properties/php.properties.json | 4 + backend/php/src/configuration.php | 36 + backend/php/src/dump.php | 103 + backend/php/src/index.php | 744 ++ backend/php/src/json/JSON.php | 806 ++ backend/php/src/objects/class.database.php | 79 + .../php/src/objects/class.onetimepassword.php | 400 + .../objects/class.onetimepasswordstatus.php | 368 + backend/php/src/objects/class.pog_base.php | 143 + backend/php/src/objects/class.record.php | 436 ++ .../php/src/objects/class.recordversion.php | 381 + backend/php/src/objects/class.user.php | 502 ++ .../php/src/objects/ignore_objects.txt | 0 backend/php/src/plugins/IPlugin.php | 48 + backend/php/src/plugins/base64_install.sql | 172 + backend/php/src/plugins/base64_uninstall.sql | 20 + backend/php/src/plugins/plugin.base64.php | 128 + .../additional_table_structures.sql | 0 .../data_initialization.sql | 0 .../src/setup/data_initialization/howto.txt | 13 + .../data_initialization/read_dump_lib.php | 205 + backend/php/src/setup/index.php | 717 ++ backend/php/src/setup/rpc.php | 227 + backend/php/src/setup/setup.css | 77 + .../src/setup/setup_images/background_id.gif | Bin 0 -> 359 bytes .../php/src/setup/setup_images/button_add.gif | Bin 0 -> 167 bytes .../src/setup/setup_images/button_delete.gif | Bin 0 -> 281 bytes .../setup_images/button_toolbar_author.gif | Bin 0 -> 2037 bytes .../setup_images/button_toolbar_help.gif | Bin 0 -> 1910 bytes .../setup_images/button_toolbar_homepage.gif | Bin 0 -> 1939 bytes .../setup_images/button_toolbar_left.gif | Bin 0 -> 636 bytes .../src/setup/setup_images/button_update.gif | Bin 0 -> 273 bytes .../src/setup/setup_images/folderclose.gif | Bin 0 -> 62 bytes .../php/src/setup/setup_images/folderopen.gif | Bin 0 -> 61 bytes .../php/src/setup/setup_images/generate.jpg | Bin 0 -> 1678 bytes .../setup/setup_images/gradient_container.gif | Bin 0 -> 179 bytes .../php/src/setup/setup_images/loading.gif | Bin 0 -> 1141 bytes .../php/src/setup/setup_images/mini_pog.jpg | Bin 0 -> 16299 bytes .../setup/setup_images/pog_setup_closed.jpg | Bin 0 -> 2029 bytes .../src/setup/setup_images/pog_setup_open.jpg | Bin 0 -> 2398 bytes .../setup/setup_images/setup_attachtables.jpg | Bin 0 -> 2106 bytes .../src/setup/setup_images/setup_bottom3.jpg | Bin 0 -> 499 bytes .../setup/setup_images/setup_bottom3tile.jpg | Bin 0 -> 311 bytes .../setup/setup_images/setup_collapseall.jpg | Bin 0 -> 2074 bytes .../setup/setup_images/setup_deleteall.jpg | Bin 0 -> 1778 bytes .../setup/setup_images/setup_expandall.jpg | Bin 0 -> 1974 bytes .../src/setup/setup_images/setup_footer.jpg | Bin 0 -> 1145 bytes .../setup/setup_images/setup_generateform.jpg | Bin 0 -> 2535 bytes .../src/setup/setup_images/setup_logo1.jpg | Bin 0 -> 7992 bytes .../src/setup/setup_images/setup_logo2.jpg | Bin 0 -> 7931 bytes .../src/setup/setup_images/setup_logo3.jpg | Bin 0 -> 6683 bytes .../src/setup/setup_images/setup_pogmeup.gif | Bin 0 -> 1420 bytes .../src/setup/setup_images/setup_proceed.gif | Bin 0 -> 839 bytes .../src/setup/setup_images/setup_recheck.jpg | Bin 0 -> 4074 bytes .../setup/setup_images/setup_regenerate.jpg | Bin 0 -> 2167 bytes .../setup_images/setup_toolbargradient.jpg | Bin 0 -> 667 bytes .../setup/setup_images/setup_updateall.jpg | Bin 0 -> 2340 bytes .../src/setup/setup_images/setup_welcome.jpg | Bin 0 -> 3849 bytes .../setup_images/tab_activeobjectleft.gif | Bin 0 -> 145 bytes .../setup_images/tab_activeobjectright.gif | Bin 0 -> 477 bytes .../setup_images/tab_diagnosticresults.gif | Bin 0 -> 368 bytes .../setup_images/tab_diagnosticresults_on.gif | Bin 0 -> 371 bytes .../setup/setup_images/tab_manageobjects.gif | Bin 0 -> 364 bytes .../setup_images/tab_manageobjects_on.gif | Bin 0 -> 371 bytes .../setup_images/tab_manageplugins_off.gif | Bin 0 -> 460 bytes .../setup_images/tab_manageplugins_on.gif | Bin 0 -> 1220 bytes .../src/setup/setup_images/tab_separator.gif | Bin 0 -> 154 bytes .../php/src/setup/setup_images/tab_setup.gif | Bin 0 -> 258 bytes .../src/setup/setup_images/tab_setup_on.gif | Bin 0 -> 472 bytes .../setup/setup_images/toolbar_separator.gif | Bin 0 -> 324 bytes .../setup/setup_library/authentication.php | 30 + .../src/setup/setup_library/class.zipfile.php | 212 + .../src/setup/setup_library/inc.footer.php | 6 + .../src/setup/setup_library/inc.header.php | 36 + .../src/setup/setup_library/setup_misc.php | 2357 ++++++ .../php/src/setup/setup_library/upgrade.php | 140 + .../php/src/setup/setup_library/xPandMenu.css | 55 + .../php/src/setup/setup_library/xPandMenu.js | 273 + .../php/src/setup/setup_library/xPandMenu.php | 233 + backend/php/src/test.php | 15 + .../python/properties/python.properties.json | 0 backend/python/src/app.yaml | 20 + backend/python/src/clipperz.py | 708 ++ doc/install.php.txt | 31 + frontend/beta/css/clipperz/clipperz.css | 3238 ++++++++ frontend/beta/css/clipperz/compact.css | 162 + frontend/beta/css/clipperz/ie.css | 351 + .../beta/css/clipperz/ytheme-clipperz.css | 141 + .../beta/css/yui-extensions/basic-dialog.css | 250 + frontend/beta/css/yui-extensions/button.css | 86 + frontend/beta/css/yui-extensions/core.css | 53 + frontend/beta/css/yui-extensions/dd.css | 81 + frontend/beta/css/yui-extensions/grid.css | 584 ++ .../beta/css/yui-extensions/inline-editor.css | 60 + frontend/beta/css/yui-extensions/layout.css | 228 + frontend/beta/css/yui-extensions/qtips.css | 70 + .../beta/css/yui-extensions/reset-min.css | 29 + .../beta/css/yui-extensions/resizable.css | 160 + frontend/beta/css/yui-extensions/tabs.css | 152 + frontend/beta/css/yui-extensions/toolbar.css | 115 + frontend/beta/css/yui-extensions/tree.css | 193 + .../beta/css/yui-extensions/ytheme-aero.css | 361 + .../beta/css/yui-extensions/ytheme-gray.css | 300 + .../beta/css/yui-extensions/ytheme-vista.css | 403 + frontend/beta/css/yui/calendar.css | 189 + frontend/beta/css/yui/container.css | 240 + frontend/beta/css/yui/fonts.css | 62 + frontend/beta/css/yui/grids.css | 116 + frontend/beta/css/yui/logger.css | 49 + frontend/beta/css/yui/menu.css | 328 + frontend/beta/css/yui/reset.css | 43 + frontend/beta/css/yui/tree.css | 132 + frontend/beta/html/index_template.html | 100 + frontend/beta/images/cardBlockLowerBorder.gif | 0 .../images/cardBlockLowerRoundedCorner.gif | 0 frontend/beta/images/cardFiltersSprite.gif | 0 .../beta/images/cardsBlockRoundCorners.gif | 0 .../clipperz/basic-dialog/btn-sprite.gif | 0 .../images/clipperz/basic-dialog/close.gif | 0 .../images/clipperz/basic-dialog/close.png | 0 .../clipperz/basic-dialog/close_over.gif | 0 .../images/clipperz/basic-dialog/e-handle.gif | 0 .../clipperz/basic-dialog/hd-sprite.gif | 0 .../images/clipperz/basic-dialog/progress.gif | 0 .../clipperz/basic-dialog/progress2.gif | 0 .../images/clipperz/basic-dialog/s-handle.gif | 0 .../clipperz/basic-dialog/se-handle.gif | 0 .../default/basic-dialog/btn-sprite.gif | 0 .../images/default/basic-dialog/close.gif | 0 .../images/default/basic-dialog/e-handle.gif | 0 .../images/default/basic-dialog/hd-sprite.gif | 0 .../images/default/basic-dialog/progress.gif | 0 .../images/default/basic-dialog/progress2.gif | 0 .../images/default/basic-dialog/s-handle.gif | 0 .../images/default/basic-dialog/se-handle.gif | 0 frontend/beta/images/directLogin/toggle.png | 0 frontend/beta/images/directLoginBox.png | 0 frontend/beta/images/entropyBackground.gif | 0 frontend/beta/images/exportLogo.png | 0 frontend/beta/images/favicon.ico | 0 frontend/beta/images/flags/br.png | 0 frontend/beta/images/flags/cn.png | 0 frontend/beta/images/flags/de.png | 0 frontend/beta/images/flags/en.png | 0 frontend/beta/images/flags/es.png | 0 frontend/beta/images/flags/it.png | 0 frontend/beta/images/flags/jp.png | 0 frontend/beta/images/flags/ru.png | 0 frontend/beta/images/grippie.png | 0 .../images/importActiveStepsSeparator.png | 0 .../beta/images/importStepsBackground.png | 0 .../images/importStepsLabelsBackground.png | 0 .../importStepsLeftLabelsBackground.png | 0 frontend/beta/images/importStepsSeparator.png | 0 frontend/beta/images/languageBox.png | 0 frontend/beta/images/loginFormBox.png | 0 frontend/beta/images/loginInfoBackground.png | 0 .../beta/images/loginInfoInnerBackground.png | 0 frontend/beta/images/logo.gif | 0 frontend/beta/images/menubarSprite.gif | 0 .../beta/images/newRecordPanelBackground.gif | 0 .../beta/images/newRecordPanelBackground.png | 0 frontend/beta/images/passwordAssistant.png | 0 frontend/beta/images/read-only.gif | 0 frontend/beta/images/read-only.png | 0 frontend/beta/images/read-only_background.png | 0 .../beta/images/recordFilterBackground.png | 0 frontend/beta/images/rss.gif | 0 frontend/beta/images/scrambledValue.gif | 0 frontend/beta/images/scrambledValue.png | 0 frontend/beta/images/smiles.gif | 0 frontend/beta/images/smiles_big.gif | 0 frontend/beta/images/smiles_small.gif | 0 frontend/beta/images/test-database.png | 0 frontend/beta/js/Bookmarklet.js | 400 + frontend/beta/js/BookmarkletHash.js | 47 + frontend/beta/js/Bookmarklet_IE.js | 23 + frontend/beta/js/Clipperz/Base.js | 308 + frontend/beta/js/Clipperz/ByteArray.js | 1426 ++++ frontend/beta/js/Clipperz/CSVProcessor.js | 348 + frontend/beta/js/Clipperz/Crypto/AES.js | 836 ++ frontend/beta/js/Clipperz/Crypto/Base.js | 1852 +++++ frontend/beta/js/Clipperz/Crypto/BigInt.js | 1760 +++++ .../beta/js/Clipperz/Crypto/BigInt_scoped.js | 1649 ++++ frontend/beta/js/Clipperz/Crypto/ECC.js | 960 +++ .../Clipperz/Crypto/ECC/BinaryField/Curve.js | 461 ++ .../Crypto/ECC/BinaryField/FiniteField.js | 526 ++ .../Clipperz/Crypto/ECC/BinaryField/Point.js | 67 + .../Clipperz/Crypto/ECC/BinaryField/Value.js | 377 + frontend/beta/js/Clipperz/Crypto/PRNG.js | 854 +++ frontend/beta/js/Clipperz/Crypto/RSA.js | 151 + frontend/beta/js/Clipperz/Crypto/SHA.js | 296 + frontend/beta/js/Clipperz/Crypto/SRP.js | 331 + frontend/beta/js/Clipperz/DOM.js | 131 + frontend/beta/js/Clipperz/Date.js | 305 + .../js/Clipperz/KeePassExportProcessor.js | 251 + .../beta/js/Clipperz/NotificationCenter.js | 325 + .../js/Clipperz/PM/BookmarkletProcessor.js | 288 + .../Clipperz/PM/Components/BaseComponent.js | 124 + .../PM/Components/Compact/CompactHeader.js | 86 + .../PM/Components/Compact/CompactInterface.js | 312 + .../PM/Components/Compact/LoginForm.js | 189 + .../Import/CSVImport/CSVImportColumns.js | 174 + .../Import/CSVImport/CSVImportFields.js | 247 + .../Import/CSVImport/CSVImportHeader.js | 240 + .../Import/CSVImport/CSVImportNotes.js | 212 + .../Import/CSVImport/CSVImportTitle.js | 189 + .../Components/Import/CSVImportComponent.js | 548 ++ .../Import/ClipperzImportComponent.js | 212 + .../Components/Import/ExcelImportComponent.js | 134 + .../Import/GenericImportComponent.js | 523 ++ .../Import/KeePassImportComponent.js | 450 ++ .../PM/Components/Import/MainComponent.js | 332 + .../Import/PasswordPlusImportComponent.js | 315 + .../Import/RoboFormImportComponent.js | 392 + .../js/Clipperz/PM/Components/MessageBox.js | 224 + .../PM/Components/OTP/MainComponent.js | 490 ++ .../PM/Components/Panels/AccountPanel.js | 784 ++ .../PM/Components/Panels/BasePanel.js | 96 + .../PM/Components/Panels/ContactsPanel.js | 105 + .../PM/Components/Panels/DataPanel.js | 486 ++ .../PM/Components/Panels/LoginPanel.js | 1114 +++ .../PM/Components/Panels/LogoutPanel.js | 73 + .../PM/Components/Panels/MainPanel.js | 906 +++ .../PM/Components/Panels/ToolsPanel.js | 305 + .../PM/Components/PasswordEntropyDisplay.js | 118 + .../PM/Components/PasswordGenerator.js | 285 + .../Clipperz/PM/Components/Printing/Footer.js | 28 + .../Clipperz/PM/Components/Printing/Header.js | 28 + .../Clipperz/PM/Components/Printing/Record.js | 95 + .../RecordDetail/AbstractComponent.js | 105 + .../RecordDetail/AbstractFieldSubComponent.js | 77 + .../Components/RecordDetail/CreationWizard.js | 317 + .../DirectLoginBindingComponent.js | 174 + .../RecordDetail/DirectLoginComponent.js | 362 + .../RecordDetail/DirectLoginValueComponent.js | 257 + .../RecordDetail/DirectLoginsComponent.js | 199 + .../RecordDetail/FieldButtonComponent.js | 117 + .../Components/RecordDetail/FieldComponent.js | 189 + .../RecordDetail/FieldDragHandler.js | 59 + .../RecordDetail/FieldLabelComponent.js | 141 + .../RecordDetail/FieldTypeComponent.js | 157 + .../RecordDetail/FieldValueComponent.js | 275 + .../RecordDetail/HeaderComponent.js | 165 + .../Components/RecordDetail/MainComponent.js | 758 ++ .../Components/RecordDetail/NotesComponent.js | 240 + .../Components/RecordDetail/TitleComponent.js | 137 + .../Components/TabPanel/TabPanelController.js | 158 + .../Clipperz/PM/Components/TextFormField.js | 310 + frontend/beta/js/Clipperz/PM/Connection.js | 584 ++ frontend/beta/js/Clipperz/PM/Crypto.js | 503 ++ .../js/Clipperz/PM/DataModel/DirectLogin.js | 536 ++ .../PM/DataModel/DirectLoginBinding.js | 113 + .../Clipperz/PM/DataModel/DirectLoginInput.js | 229 + .../PM/DataModel/DirectLoginReference.js | 192 + .../beta/js/Clipperz/PM/DataModel/Header.js | 751 ++ .../Clipperz/PM/DataModel/OneTimePassword.js | 333 + .../PM/DataModel/OneTimePasswordManager.js | 280 + .../beta/js/Clipperz/PM/DataModel/Record.js | 759 ++ .../js/Clipperz/PM/DataModel/RecordField.js | 220 + .../js/Clipperz/PM/DataModel/RecordVersion.js | 535 ++ .../js/Clipperz/PM/DataModel/Statistics.js | 133 + .../beta/js/Clipperz/PM/DataModel/User.js | 904 +++ .../Clipperz/PM/DataModel/UserPreferences.js | 197 + frontend/beta/js/Clipperz/PM/Date.js | 193 + frontend/beta/js/Clipperz/PM/Main.js | 588 ++ frontend/beta/js/Clipperz/PM/Proxy.js | 173 + .../beta/js/Clipperz/PM/Proxy/Proxy.JSON.js | 100 + .../PM/Proxy/Proxy.Offline.DataStore.js | 804 ++ .../js/Clipperz/PM/Proxy/Proxy.Offline.js | 73 + .../beta/js/Clipperz/PM/Proxy/Proxy.PHP.js | 259 + .../beta/js/Clipperz/PM/Proxy/Proxy.Test.js | 94 + frontend/beta/js/Clipperz/PM/Strings.js | 231 + .../PM/Strings/MessagePanelConfigurations.js | 389 + .../js/Clipperz/PM/Strings/Strings_de-DE.js | 352 + .../js/Clipperz/PM/Strings/Strings_el-GR.js | 701 ++ .../js/Clipperz/PM/Strings/Strings_en-CA.js | 43 + .../js/Clipperz/PM/Strings/Strings_en-GB.js | 43 + .../js/Clipperz/PM/Strings/Strings_en-US.js | 1259 +++ .../js/Clipperz/PM/Strings/Strings_es-ES.js | 480 ++ .../js/Clipperz/PM/Strings/Strings_fr-FR.js | 362 + .../js/Clipperz/PM/Strings/Strings_he-IL.js | 40 + .../js/Clipperz/PM/Strings/Strings_it-IT.js | 694 ++ .../js/Clipperz/PM/Strings/Strings_ja-JP.js | 808 ++ .../js/Clipperz/PM/Strings/Strings_pt-BR.js | 478 ++ .../js/Clipperz/PM/Strings/Strings_pt-PT.js | 42 + .../js/Clipperz/PM/Strings/Strings_ru-RU.js | 440 ++ .../js/Clipperz/PM/Strings/Strings_zh-CN.js | 477 ++ frontend/beta/js/Clipperz/PM/Toll.js | 193 + frontend/beta/js/Clipperz/Profile.js | 485 ++ frontend/beta/js/Clipperz/Set.js | 167 + frontend/beta/js/Clipperz/Signal.js | 71 + frontend/beta/js/Clipperz/Style.js | 73 + frontend/beta/js/Clipperz/YUI/Collapser.js | 73 + frontend/beta/js/Clipperz/YUI/DomHelper.js | 465 ++ frontend/beta/js/Clipperz/YUI/DomQuery.js | 710 ++ frontend/beta/js/Clipperz/YUI/Drawer.js | 238 + .../beta/js/Clipperz/YUI/IBLayoutManager.js | 114 + .../beta/js/Clipperz/YUI/IBLayoutRegion.js | 249 + frontend/beta/js/Clipperz/YUI/MessageBox.js | 265 + frontend/beta/js/JSON/json2.js | 481 ++ frontend/beta/js/MochiKit/Async.js | 683 ++ frontend/beta/js/MochiKit/Base.js | 1403 ++++ frontend/beta/js/MochiKit/Color.js | 902 +++ frontend/beta/js/MochiKit/Controls.js | 1388 ++++ frontend/beta/js/MochiKit/DOM.js | 1267 +++ frontend/beta/js/MochiKit/DateTime.js | 216 + frontend/beta/js/MochiKit/DragAndDrop.js | 824 ++ frontend/beta/js/MochiKit/Format.js | 304 + frontend/beta/js/MochiKit/Iter.js | 843 ++ frontend/beta/js/MochiKit/Logging.js | 321 + frontend/beta/js/MochiKit/LoggingPane.js | 374 + frontend/beta/js/MochiKit/MochiKit.js | 154 + frontend/beta/js/MochiKit/MockDOM.js | 115 + frontend/beta/js/MochiKit/New.js | 1 + frontend/beta/js/MochiKit/Position.js | 246 + frontend/beta/js/MochiKit/Selector.js | 431 ++ frontend/beta/js/MochiKit/Signal.js | 864 +++ frontend/beta/js/MochiKit/Sortable.js | 589 ++ frontend/beta/js/MochiKit/Style.js | 444 ++ frontend/beta/js/MochiKit/Test.js | 181 + frontend/beta/js/MochiKit/Visual.js | 1976 +++++ frontend/beta/js/MochiKit/__package__.js | 18 + frontend/beta/js/YUI-extensions/Bench.js | 40 + frontend/beta/js/YUI-extensions/CSS.js | 208 + .../js/YUI-extensions/CompositeElement.js | 140 + .../beta/js/YUI-extensions/CustomTagReader.js | 40 + frontend/beta/js/YUI-extensions/Date.js | 407 + frontend/beta/js/YUI-extensions/DomHelper.js | 416 + frontend/beta/js/YUI-extensions/Element.js | 2157 ++++++ .../beta/js/YUI-extensions/EventManager.js | 456 ++ frontend/beta/js/YUI-extensions/JSON.js | 132 + frontend/beta/js/YUI-extensions/KeyMap.js | 135 + frontend/beta/js/YUI-extensions/Layer.js | 246 + .../beta/js/YUI-extensions/MixedCollection.js | 344 + frontend/beta/js/YUI-extensions/State.js | 264 + .../beta/js/YUI-extensions/UpdateManager.js | 484 ++ frontend/beta/js/YUI-extensions/anim/Actor.js | 759 ++ .../beta/js/YUI-extensions/anim/Animator.js | 482 ++ .../YUI-extensions/data/AbstractDataModel.js | 226 + .../YUI-extensions/data/DefaultDataModel.js | 339 + .../js/YUI-extensions/data/JSONDataModel.js | 81 + .../YUI-extensions/data/LoadableDataModel.js | 330 + frontend/beta/js/YUI-extensions/data/Tree.js | 412 + .../js/YUI-extensions/data/XMLDataModel.js | 274 + .../beta/js/YUI-extensions/dd/DragSource.js | 218 + .../beta/js/YUI-extensions/dd/DragZone.js | 64 + .../beta/js/YUI-extensions/dd/DropTarget.js | 45 + .../beta/js/YUI-extensions/dd/DropZone.js | 81 + .../beta/js/YUI-extensions/dd/Registry.js | 80 + .../js/YUI-extensions/dd/ScrollManager.js | 171 + .../beta/js/YUI-extensions/dd/StatusProxy.js | 110 + .../grid/AbstractColumnModel.js | 131 + .../YUI-extensions/grid/DefaultColumnModel.js | 325 + .../beta/js/YUI-extensions/grid/EditorGrid.js | 16 + .../grid/EditorSelectionModel.js | 182 + frontend/beta/js/YUI-extensions/grid/Grid.js | 965 +++ .../beta/js/YUI-extensions/grid/GridDD.js | 101 + .../beta/js/YUI-extensions/grid/GridView.js | 790 ++ .../js/YUI-extensions/grid/PagedGridView.js | 194 + .../js/YUI-extensions/grid/SelectionModel.js | 445 ++ .../YUI-extensions/grid/editor/CellEditor.js | 91 + .../grid/editor/CheckboxEditor.js | 60 + .../YUI-extensions/grid/editor/DateEditor.js | 268 + .../grid/editor/NumberEditor.js | 166 + .../grid/editor/SelectEditor.js | 37 + .../YUI-extensions/grid/editor/TextEditor.js | 110 + .../layout/BasicLayoutRegion.js | 265 + .../js/YUI-extensions/layout/BorderLayout.js | 281 + .../layout/BorderLayoutRegions.js | 207 + .../js/YUI-extensions/layout/ContentPanels.js | 325 + .../js/YUI-extensions/layout/LayoutManager.js | 135 + .../js/YUI-extensions/layout/LayoutRegion.js | 496 ++ .../layout/LayoutStateManager.js | 68 + .../layout/SplitLayoutRegion.js | 282 + .../js/YUI-extensions/tree/AsyncTreeNode.js | 58 + .../js/YUI-extensions/tree/TreeDragZone.js | 43 + .../js/YUI-extensions/tree/TreeDropZone.js | 228 + .../beta/js/YUI-extensions/tree/TreeFilter.js | 105 + .../beta/js/YUI-extensions/tree/TreeLoader.js | 107 + .../beta/js/YUI-extensions/tree/TreeNode.js | 300 + .../beta/js/YUI-extensions/tree/TreeNodeUI.js | 452 ++ .../beta/js/YUI-extensions/tree/TreePanel.js | 213 + .../YUI-extensions/tree/TreeSelectionModel.js | 195 + .../beta/js/YUI-extensions/tree/TreeSorter.js | 49 + .../js/YUI-extensions/widgets/BasicDialog.js | 1046 +++ .../beta/js/YUI-extensions/widgets/Button.js | 185 + .../js/YUI-extensions/widgets/DatePicker.js | 344 + .../js/YUI-extensions/widgets/InlineEditor.js | 216 + .../js/YUI-extensions/widgets/MessageBox.js | 230 + .../js/YUI-extensions/widgets/QuickTips.js | 311 + .../js/YUI-extensions/widgets/Resizable.js | 586 ++ .../js/YUI-extensions/widgets/SplitBar.js | 468 ++ .../js/YUI-extensions/widgets/TabPanel.js | 756 ++ .../js/YUI-extensions/widgets/TaskPanel.js | 0 .../js/YUI-extensions/widgets/TemplateView.js | 766 ++ .../beta/js/YUI-extensions/widgets/Toolbar.js | 296 + frontend/beta/js/YUI-extensions/yutil.js | 637 ++ frontend/beta/js/YUI/animation.js | 1272 ++++ frontend/beta/js/YUI/autocomplete.js | 3066 ++++++++ frontend/beta/js/YUI/calendar.js | 4239 +++++++++++ frontend/beta/js/YUI/connection.js | 960 +++ frontend/beta/js/YUI/container.js | 4561 +++++++++++ frontend/beta/js/YUI/dom.js | 881 +++ frontend/beta/js/YUI/dragdrop.js | 2940 +++++++ frontend/beta/js/YUI/event.js | 1738 +++++ frontend/beta/js/YUI/logger.js | 1559 ++++ frontend/beta/js/YUI/menu.js | 6780 +++++++++++++++++ frontend/beta/js/YUI/slider.js | 1113 +++ frontend/beta/js/YUI/tabview.js | 1950 +++++ frontend/beta/js/YUI/treeview.js | 2182 ++++++ frontend/beta/js/YUI/yahoo.js | 145 + frontend/beta/properties/beta.properties.json | 183 + .../beta/properties/creditsAndCopyrights.txt | 335 + frontend/gamma/css/clipperz/clipperz.css | 4520 +++++++++++ frontend/gamma/css/clipperz/compact.css | 162 + frontend/gamma/css/clipperz/iPhone.css | 464 ++ frontend/gamma/css/clipperz/ie.css | 356 + frontend/gamma/graphics/CoverActions.opacity | Bin 0 -> 25547 bytes frontend/gamma/graphics/Features.opacity | Bin 0 -> 140849 bytes frontend/gamma/graphics/GridSorting.opacity | Bin 0 -> 14681 bytes frontend/gamma/graphics/Logo.opacity | Bin 0 -> 10647 bytes frontend/gamma/graphics/Marks.opacity | Bin 0 -> 25340 bytes .../gamma/graphics/RegisterButton.opacity | Bin 0 -> 44806 bytes frontend/gamma/graphics/Star.opacity | Bin 0 -> 16210 bytes frontend/gamma/graphics/Tips.opacity | Bin 0 -> 46046 bytes frontend/gamma/html/exitPage_template.html | 140 + frontend/gamma/html/index_template.html | 62 + frontend/gamma/html/mobile_template.html | 87 + frontend/gamma/js/Bookmarklet.js | 801 ++ frontend/gamma/js/BookmarkletHash.js | 47 + frontend/gamma/js/Bookmarklet_1.js | 400 + frontend/gamma/js/Bookmarklet_2.js | 767 ++ frontend/gamma/js/Bookmarklet_IE.js | 23 + frontend/gamma/js/Clipperz/Async.js | 707 ++ frontend/gamma/js/Clipperz/Base.js | 531 ++ frontend/gamma/js/Clipperz/ByteArray.js | 1501 ++++ frontend/gamma/js/Clipperz/CSVProcessor.js | 349 + frontend/gamma/js/Clipperz/Crypto/AES.js | 869 +++ frontend/gamma/js/Clipperz/Crypto/Base.js | 1852 +++++ frontend/gamma/js/Clipperz/Crypto/BigInt.js | 1760 +++++ .../gamma/js/Clipperz/Crypto/BigInt_scoped.js | 1649 ++++ .../Clipperz/Crypto/ECC/BinaryField/Curve.js | 550 ++ .../Crypto/ECC/BinaryField/FiniteField.js | 526 ++ .../Clipperz/Crypto/ECC/BinaryField/Point.js | 67 + .../Clipperz/Crypto/ECC/BinaryField/Value.js | 386 + .../js/Clipperz/Crypto/ECC/StandardCurves.js | 239 + frontend/gamma/js/Clipperz/Crypto/PRNG.js | 855 +++ frontend/gamma/js/Clipperz/Crypto/RSA.js | 151 + frontend/gamma/js/Clipperz/Crypto/SHA.js | 301 + frontend/gamma/js/Clipperz/Crypto/SRP.js | 331 + frontend/gamma/js/Clipperz/DOM.js | 139 + frontend/gamma/js/Clipperz/Date.js | 305 + .../js/Clipperz/KeePassExportProcessor.js | 196 + .../gamma/js/Clipperz/KeyValueObjectStore.js | 176 + frontend/gamma/js/Clipperz/Logging.js | 42 + .../js/Clipperz/PM/BookmarkletProcessor.js | 196 + frontend/gamma/js/Clipperz/PM/Connection.js | 619 ++ frontend/gamma/js/Clipperz/PM/Crypto.js | 513 ++ .../js/Clipperz/PM/DataModel/DirectLogin.js | 1076 +++ .../PM/DataModel/DirectLoginBinding.js | 125 + .../PM/DataModel/DirectLoginFormValue.js | 107 + .../Clipperz/PM/DataModel/DirectLoginInput.js | 203 + .../PM/DataModel/EncryptedRemoteObject.js | 551 ++ .../Clipperz/PM/DataModel/OneTimePassword.js | 357 + .../PM/DataModel/Record.Version.Field.js | 167 + .../Clipperz/PM/DataModel/Record.Version.js | 336 + .../gamma/js/Clipperz/PM/DataModel/Record.js | 881 +++ .../PM/DataModel/User.Header.Legacy.js | 187 + .../DataModel/User.Header.OneTimePasswords.js | 128 + .../PM/DataModel/User.Header.Preferences.js | 53 + .../PM/DataModel/User.Header.RecordIndex.js | 705 ++ .../gamma/js/Clipperz/PM/DataModel/User.js | 817 ++ frontend/gamma/js/Clipperz/PM/Date.js | 201 + frontend/gamma/js/Clipperz/PM/Proxy.js | 172 + .../gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js | 94 + .../PM/Proxy/Proxy.Offline.DataStore.js | 811 ++ .../js/Clipperz/PM/Proxy/Proxy.Offline.js | 67 + .../gamma/js/Clipperz/PM/Proxy/Proxy.Test.js | 167 + frontend/gamma/js/Clipperz/PM/Strings.js | 295 + .../PM/Strings/MessagePanelConfigurations.js | 389 + .../Clipperz/PM/Strings/Strings_defaults.js | 390 + .../js/Clipperz/PM/Strings/Strings_en-US.js | 1341 ++++ frontend/gamma/js/Clipperz/PM/Toll.js | 194 + .../PM/UI/Canvas/CoverActions/download.js | 120 + .../PM/UI/Canvas/CoverActions/look.js | 208 + .../PM/UI/Canvas/Features/directLogin.js | 209 + .../Clipperz/PM/UI/Canvas/Features/protect.js | 237 + .../Clipperz/PM/UI/Canvas/Features/share.js | 1719 +++++ .../Clipperz/PM/UI/Canvas/Features/store.js | 310 + .../Clipperz/PM/UI/Canvas/GraphicFunctions.js | 68 + .../js/Clipperz/PM/UI/Canvas/Logo/normal.js | 65 + .../PM/UI/Canvas/Marks/exclamationMark.js | 280 + .../js/Clipperz/PM/UI/Canvas/Marks/info.js | 391 + .../PM/UI/Canvas/Marks/questionMark.js | 438 ++ .../PM/UI/Canvas/RegisterButton/normal.js | 403 + .../js/Clipperz/PM/UI/Canvas/Star/normal.js | 153 + .../js/Clipperz/PM/UI/Canvas/Tips/close.js | 156 + .../js/Clipperz/PM/UI/Canvas/Tips/open.js | 163 + .../PM/UI/Common/Components/BaseComponent.js | 611 ++ .../PM/UI/Common/Components/Button.js | 108 + .../PM/UI/Common/Components/ComponentSlot.js | 64 + .../UI/Common/Components/FaviconComponent.js | 91 + .../Components/MessagePanelWithProgressBar.js | 164 + .../Components/PasswordEntropyDisplay.js | 140 + .../PM/UI/Common/Components/ProgressBar.js | 73 + .../Common/Components/SimpleMessagePanel.js | 282 + .../UI/Common/Components/TabPanelComponent.js | 69 + .../PM/UI/Common/Components/Tooltip.js | 216 + .../UI/Common/Components/TranslatorWidget.js | 170 + .../Common/Controllers/DirectLoginRunner.js | 267 + .../Controllers/ProgressBarController.js | 143 + .../Common/Controllers/TabPanelController.js | 188 + .../UI/Common/Controllers/WizardController.js | 31 + .../Clipperz/PM/UI/Compact/MainController.js | 59 + .../PM/UI/Web/Components/AccountPanel.js | 148 + .../Clipperz/PM/UI/Web/Components/AppPage.js | 78 + .../UI/Web/Components/BookmarkletComponent.js | 109 + .../UI/Web/Components/CardDialogComponent.js | 881 +++ .../CardDialogRecordDirectLoginComponent.js | 182 + .../CardDialogRecordFieldComponent.js | 190 + .../PM/UI/Web/Components/ColumnManager.js | 203 + .../CreateNewCardSplashComponent.js | 71 + .../PM/UI/Web/Components/DataPanel.js | 111 + .../PM/UI/Web/Components/DateColumnManager.js | 72 + .../Components/DeleteObjectColumnManager.js | 70 + .../Components/DirectLoginColumnManager.js | 90 + .../DirectLoginEditingBindingComponent.js | 168 + .../Components/DirectLoginEditingComponent.js | 481 ++ .../DirectLoginEditingFormValueComponent.js | 179 + .../Components/DirectLoginsColumnManager.js | 271 + .../UI/Web/Components/FaviconColumnManager.js | 89 + .../PM/UI/Web/Components/GridComponent.js | 262 + .../UI/Web/Components/ImageColumnManager.js | 68 + .../PM/UI/Web/Components/LinkColumnManager.js | 92 + .../PM/UI/Web/Components/LoginForm.js | 203 + .../PM/UI/Web/Components/LoginPage.js | 206 + .../PM/UI/Web/Components/LoginProgress.js | 155 + .../Components/NewUserCreationComponent.js | 430 ++ .../js/Clipperz/PM/UI/Web/Components/Page.js | 71 + .../PM/UI/Web/Components/PageFooter.js | 71 + .../PM/UI/Web/Components/PageHeader.js | 184 + .../PM/UI/Web/Components/PasswordTooltip.js | 164 + .../PM/UI/Web/Components/RulerComponent.js | 324 + .../PM/UI/Web/Components/TabSidePanel.js | 193 + .../PM/UI/Web/Components/TextColumnManager.js | 53 + .../PM/UI/Web/Components/ToolsPanel.js | 113 + .../Web/Components/UnlockPasswordComponent.js | 184 + .../PM/UI/Web/Components/UserInfoBox.js | 346 + .../PM/UI/Web/Controllers/AppController.js | 329 + .../Web/Controllers/CardDialogController.js | 652 ++ .../PM/UI/Web/Controllers/CardsController.js | 207 + .../DirectLoginWizardController.js | 611 ++ .../Web/Controllers/DirectLoginsController.js | 145 + .../PM/UI/Web/Controllers/FilterController.js | 158 + .../PM/UI/Web/Controllers/GridController.js | 374 + .../PM/UI/Web/Controllers/LoginController.js | 259 + .../PM/UI/Web/Controllers/MainController.js | 218 + .../Controllers/NewUserWizardController.js | 469 ++ .../PM/UI/iPhone/Components/CardDetail.js | 166 + .../PM/UI/iPhone/Components/CardList.js | 204 + .../PM/UI/iPhone/Components/LoginForm.js | 181 + .../UI/iPhone/Controllers/MainController.js | 372 + frontend/gamma/js/Clipperz/Set.js | 167 + frontend/gamma/js/Clipperz/Signal.js | 71 + frontend/gamma/js/Clipperz/Style.js | 94 + frontend/gamma/js/Clipperz/Visual.js | 368 + frontend/gamma/js/Clipperz/YUI/DomHelper.js | 481 ++ frontend/gamma/js/Clipperz/YUI/DomQuery.js | 714 ++ frontend/gamma/js/Clipperz/YUI/Utils.js | 98 + frontend/gamma/js/JSON/json2.js | 481 ++ frontend/gamma/js/MochiKit/Async.js | 640 ++ frontend/gamma/js/MochiKit/Base.js | 1452 ++++ frontend/gamma/js/MochiKit/Color.js | 832 ++ frontend/gamma/js/MochiKit/DOM.js | 1144 +++ frontend/gamma/js/MochiKit/DateTime.js | 173 + frontend/gamma/js/MochiKit/DragAndDrop.js | 766 ++ frontend/gamma/js/MochiKit/Format.js | 309 + frontend/gamma/js/MochiKit/Iter.js | 790 ++ frontend/gamma/js/MochiKit/Logging.js | 262 + frontend/gamma/js/MochiKit/LoggingPane.js | 327 + frontend/gamma/js/MochiKit/MochiKit.js | 136 + frontend/gamma/js/MochiKit/MockDOM.js | 115 + frontend/gamma/js/MochiKit/Position.js | 218 + frontend/gamma/js/MochiKit/Selector.js | 387 + frontend/gamma/js/MochiKit/Signal.js | 888 +++ frontend/gamma/js/MochiKit/Sortable.js | 569 ++ frontend/gamma/js/MochiKit/Style.js | 558 ++ frontend/gamma/js/MochiKit/Test.js | 144 + frontend/gamma/js/MochiKit/Text.js | 577 ++ frontend/gamma/js/MochiKit/Visual.js | 1975 +++++ frontend/gamma/js/MochiKit/__package__.js | 18 + frontend/gamma/js/main.js | 109 + frontend/gamma/js/main_iPhone.js | 60 + .../gamma/properties/creditsAndCopyrights.txt | 336 + .../gamma/properties/gamma.properties.json | 189 + .../gamma/properties/mobile.properties.json | 119 + .../tests/SimpleTest/SimpleTest.Async.js | 169 + frontend/gamma/tests/SimpleTest/SimpleTest.js | 424 ++ frontend/gamma/tests/SimpleTest/TestRunner.js | 233 + frontend/gamma/tests/SimpleTest/test.css | 28 + frontend/gamma/tests/index.html | 56 + .../tests/tests/Bookmarklet/Bookmarklet.css | 201 + .../gamma/tests/tests/Bookmarklet/Fail.html | 113 + .../tests/tests/Bookmarklet/Twitter.html | 113 + .../tests/tests/Bookmarklet/ZeroClipboard.swf | Bin 0 -> 1071 bytes .../tests/tests/Bookmarklet/background.png | Bin 0 -> 10335 bytes .../gamma/tests/tests/Bookmarklet/close.png | Bin 0 -> 3984 bytes .../tests/Bookmarklet/close_selected.png | Bin 0 -> 3995 bytes .../gamma/tests/tests/Bookmarklet/copy.png | Bin 0 -> 5241 bytes .../tests/tests/Bookmarklet/copy_selected.png | Bin 0 -> 5169 bytes .../gamma/tests/tests/Bookmarklet/error.png | Bin 0 -> 4682 bytes .../gamma/tests/tests/Bookmarklet/hint.png | Bin 0 -> 3999 bytes .../gamma/tests/tests/Bookmarklet/index.html | 42 + .../gamma/tests/tests/Bookmarklet/info.png | Bin 0 -> 4781 bytes .../gamma/tests/tests/Clipperz/Async.html | 53 + .../gamma/tests/tests/Clipperz/Async.test.js | 687 ++ frontend/gamma/tests/tests/Clipperz/Base.html | 55 + .../gamma/tests/tests/Clipperz/Base.test.js | 367 + .../gamma/tests/tests/Clipperz/ByteArray.html | 71 + .../tests/tests/Clipperz/ByteArray.test.js | 893 +++ .../tests/tests/Clipperz/Crypto/AES.html | 292 + .../Clipperz/Crypto/AES.performance.html | 344 + .../tests/tests/Clipperz/Crypto/Base.html | 428 ++ .../tests/tests/Clipperz/Crypto/BigInt.html | 478 ++ .../Clipperz/Crypto/ECC.B283.deferred.html | 155 + .../ECC.BinaryField.FiniteField.B283.html | 209 + .../Crypto/ECC.BinaryField.FiniteField.html | 183 + .../Crypto/ECC.BinaryField.Value.html | 496 ++ .../Clipperz/Crypto/ECC.K283.deferred.html | 160 + .../Clipperz/Crypto/JSCrypto_vs_Clipperz.html | 70 + .../Crypto/JSCrypto_vs_Clipperz.test.js | 418 + .../tests/tests/Clipperz/Crypto/PRNG.html | 117 + .../tests/tests/Clipperz/Crypto/RSA.html | 90 + .../tests/tests/Clipperz/Crypto/SHA.html | 175 + .../tests/tests/Clipperz/Crypto/SHA.test.js | 84 + .../tests/tests/Clipperz/Crypto/SRP.html | 161 + .../tests/tests/Clipperz/Crypto/Usage.html | 122 + .../tests/tests/Clipperz/Crypto/index.html | 58 + .../tests/tests/Clipperz/Crypto/jscrypto.js | 1577 ++++ frontend/gamma/tests/tests/Clipperz/DOM.html | 58 + .../gamma/tests/tests/Clipperz/DOM.test.js | 82 + frontend/gamma/tests/tests/Clipperz/Date.html | 54 + .../gamma/tests/tests/Clipperz/Date.test.js | 66 + .../Clipperz/KeePassExportProcessor.data.js | 910 +++ .../Clipperz/KeePassExportProcessor.html | 59 + .../Clipperz/KeePassExportProcessor.test.js | 141 + .../tests/Clipperz/KeyValueObjectStore.html | 52 + .../Clipperz/KeyValueObjectStore.test.js | 255 + .../Clipperz/PM/BookmarkletProcessor.html | 59 + .../Clipperz/PM/BookmarkletProcessor.test.js | 132 + .../tests/Clipperz/PM/Connection.data.js | 841 ++ .../tests/tests/Clipperz/PM/Connection.html | 71 + .../tests/Clipperz/PM/Connection.test.js | 255 + .../gamma/tests/tests/Clipperz/PM/Crypto.html | 281 + .../PM/Crypto_performanceEvaluation.html | 153 + .../tests/tests/Clipperz/PM/Crypto_test.html | 169 + .../Clipperz/PM/DataModel/DirectLogin.html | 103 + .../Clipperz/PM/DataModel/DirectLogin.test.js | 195 + .../DirectLoginConfigurations.data.js | 33 + .../PM/DataModel/EncryptedRemoteObject.html | 66 + .../DataModel/EncryptedRemoteObject.test.js | 225 + .../PM/DataModel/OneTimePassword.html | 105 + .../PM/DataModel/OneTimePassword.test.js | 198 + .../tests/Clipperz/PM/DataModel/Record.html | 98 + .../Clipperz/PM/DataModel/Record.test.js | 1285 ++++ .../tests/Clipperz/PM/DataModel/User.data.js | 1941 +++++ .../Clipperz/PM/DataModel/User.data.old.js | 172 + .../tests/Clipperz/PM/DataModel/User.html | 106 + .../tests/Clipperz/PM/DataModel/User.test.js | 2082 +++++ .../tests/Clipperz/PM/DataModel/index.html | 47 + .../gamma/tests/tests/Clipperz/PM/Date.html | 59 + .../tests/tests/Clipperz/PM/Date.test.js | 90 + .../gamma/tests/tests/Clipperz/PM/Proxy.html | 65 + .../tests/tests/Clipperz/PM/Proxy.test.js | 117 + .../gamma/tests/tests/Clipperz/PM/Toll.html | 62 + .../tests/tests/Clipperz/PM/Toll.test.js | 202 + .../PM/UI/Web/Controllers/MainController.html | 64 + .../UI/Web/Controllers/MainController.test.js | 90 + .../Clipperz/PM/UI/Web/Controllers/index.html | 46 + .../tests/tests/Clipperz/PM/UI/Web/index.html | 45 + .../tests/tests/Clipperz/PM/UI/index.html | 45 + .../gamma/tests/tests/Clipperz/PM/index.html | 56 + .../Clipperz/RoboFormExportProcessor.html | 210 + frontend/gamma/tests/tests/Clipperz/Set.html | 54 + .../gamma/tests/tests/Clipperz/Set.test.js | 165 + .../gamma/tests/tests/Clipperz/index.html | 49 + .../tests/Clipperz/index_googleCode.html | 50 + .../tests/tests/Clipperz/index_testECC.html | 50 + .../CardDialogEditing_test.js | 238 + .../Components/CardDialogEditing/User.data.js | 1881 +++++ .../CardDialogEditing/dragAndDrop_test.js | 128 + .../Components/CardDialogEditing/index.html | 133 + .../Components/CardDialogNew/User.data.js | 977 +++ .../CardDialogNew/cardDialogNew_test.js | 127 + .../tests/Components/CardDialogNew/index.html | 117 + .../tests/tests/Components/FullApp/README.txt | 1 + .../tests/Components/FullApp/User.data.js | 1044 +++ .../tests/tests/Components/FullApp/index.html | 243 + .../tests/Components/FullApp/main_test.js | 114 + .../Components/GridLayout/GridLayout_test.js | 119 + .../GridLayout/TestPageComponent.js | 102 + .../tests/Components/GridLayout/User.data.js | 977 +++ .../tests/Components/GridLayout/index.html | 135 + .../tests/Components/GridLayout/test.css | 43 + .../tests/Components/ProgressBar/index.html | 120 + .../ProgressBar/progressBar_test.js | 125 + .../Components/SimpleMessagePanel/index.html | 115 + .../simpleMessagePanel_test.js | 95 + .../tests/Components/Tooltips/index.html | 143 + .../Components/Tooltips/tooltips_test.js | 117 + .../Components/UnlockPassword/User.data.js | 977 +++ .../Components/UnlockPassword/index.html | 117 + .../UnlockPassword/unlockPassword_test.js | 136 + .../CrossWindowsBookmarklet_test.js | 66 + .../crossWindowsBookmarklet/index.html | 73 + frontend/gamma/tests/tests/index.html | 48 + properties/license.txt | 22 + scripts/build | 5 + scripts/builder/backendBuilder.py | 89 + scripts/builder/cssmin.py | 223 + scripts/builder/frontendBuilder.py | 398 + scripts/builder/jsmin.py | 246 + scripts/builder/main.py | 166 + scripts/builder/phpBuilder.py | 14 + scripts/builder/pythonBuilder.py | 14 + 729 files changed, 232898 insertions(+) create mode 100644 .gitignore create mode 100644 LICENCE.txt create mode 100644 README.md create mode 100644 backend/php/properties/php.properties.json create mode 100644 backend/php/src/configuration.php create mode 100644 backend/php/src/dump.php create mode 100644 backend/php/src/index.php create mode 100644 backend/php/src/json/JSON.php create mode 100644 backend/php/src/objects/class.database.php create mode 100644 backend/php/src/objects/class.onetimepassword.php create mode 100644 backend/php/src/objects/class.onetimepasswordstatus.php create mode 100644 backend/php/src/objects/class.pog_base.php create mode 100644 backend/php/src/objects/class.record.php create mode 100644 backend/php/src/objects/class.recordversion.php create mode 100644 backend/php/src/objects/class.user.php rename README => backend/php/src/objects/ignore_objects.txt (100%) create mode 100644 backend/php/src/plugins/IPlugin.php create mode 100644 backend/php/src/plugins/base64_install.sql create mode 100644 backend/php/src/plugins/base64_uninstall.sql create mode 100644 backend/php/src/plugins/plugin.base64.php create mode 100644 backend/php/src/setup/data_initialization/additional_table_structures.sql create mode 100644 backend/php/src/setup/data_initialization/data_initialization.sql create mode 100644 backend/php/src/setup/data_initialization/howto.txt create mode 100644 backend/php/src/setup/data_initialization/read_dump_lib.php create mode 100644 backend/php/src/setup/index.php create mode 100644 backend/php/src/setup/rpc.php create mode 100644 backend/php/src/setup/setup.css create mode 100644 backend/php/src/setup/setup_images/background_id.gif create mode 100644 backend/php/src/setup/setup_images/button_add.gif create mode 100644 backend/php/src/setup/setup_images/button_delete.gif create mode 100644 backend/php/src/setup/setup_images/button_toolbar_author.gif create mode 100644 backend/php/src/setup/setup_images/button_toolbar_help.gif create mode 100644 backend/php/src/setup/setup_images/button_toolbar_homepage.gif create mode 100644 backend/php/src/setup/setup_images/button_toolbar_left.gif create mode 100644 backend/php/src/setup/setup_images/button_update.gif create mode 100644 backend/php/src/setup/setup_images/folderclose.gif create mode 100644 backend/php/src/setup/setup_images/folderopen.gif create mode 100644 backend/php/src/setup/setup_images/generate.jpg create mode 100644 backend/php/src/setup/setup_images/gradient_container.gif create mode 100644 backend/php/src/setup/setup_images/loading.gif create mode 100644 backend/php/src/setup/setup_images/mini_pog.jpg create mode 100644 backend/php/src/setup/setup_images/pog_setup_closed.jpg create mode 100644 backend/php/src/setup/setup_images/pog_setup_open.jpg create mode 100644 backend/php/src/setup/setup_images/setup_attachtables.jpg create mode 100644 backend/php/src/setup/setup_images/setup_bottom3.jpg create mode 100644 backend/php/src/setup/setup_images/setup_bottom3tile.jpg create mode 100644 backend/php/src/setup/setup_images/setup_collapseall.jpg create mode 100644 backend/php/src/setup/setup_images/setup_deleteall.jpg create mode 100644 backend/php/src/setup/setup_images/setup_expandall.jpg create mode 100644 backend/php/src/setup/setup_images/setup_footer.jpg create mode 100644 backend/php/src/setup/setup_images/setup_generateform.jpg create mode 100644 backend/php/src/setup/setup_images/setup_logo1.jpg create mode 100644 backend/php/src/setup/setup_images/setup_logo2.jpg create mode 100644 backend/php/src/setup/setup_images/setup_logo3.jpg create mode 100644 backend/php/src/setup/setup_images/setup_pogmeup.gif create mode 100644 backend/php/src/setup/setup_images/setup_proceed.gif create mode 100644 backend/php/src/setup/setup_images/setup_recheck.jpg create mode 100644 backend/php/src/setup/setup_images/setup_regenerate.jpg create mode 100644 backend/php/src/setup/setup_images/setup_toolbargradient.jpg create mode 100644 backend/php/src/setup/setup_images/setup_updateall.jpg create mode 100644 backend/php/src/setup/setup_images/setup_welcome.jpg create mode 100644 backend/php/src/setup/setup_images/tab_activeobjectleft.gif create mode 100644 backend/php/src/setup/setup_images/tab_activeobjectright.gif create mode 100644 backend/php/src/setup/setup_images/tab_diagnosticresults.gif create mode 100644 backend/php/src/setup/setup_images/tab_diagnosticresults_on.gif create mode 100644 backend/php/src/setup/setup_images/tab_manageobjects.gif create mode 100644 backend/php/src/setup/setup_images/tab_manageobjects_on.gif create mode 100644 backend/php/src/setup/setup_images/tab_manageplugins_off.gif create mode 100644 backend/php/src/setup/setup_images/tab_manageplugins_on.gif create mode 100644 backend/php/src/setup/setup_images/tab_separator.gif create mode 100644 backend/php/src/setup/setup_images/tab_setup.gif create mode 100644 backend/php/src/setup/setup_images/tab_setup_on.gif create mode 100644 backend/php/src/setup/setup_images/toolbar_separator.gif create mode 100644 backend/php/src/setup/setup_library/authentication.php create mode 100644 backend/php/src/setup/setup_library/class.zipfile.php create mode 100644 backend/php/src/setup/setup_library/inc.footer.php create mode 100644 backend/php/src/setup/setup_library/inc.header.php create mode 100644 backend/php/src/setup/setup_library/setup_misc.php create mode 100644 backend/php/src/setup/setup_library/upgrade.php create mode 100644 backend/php/src/setup/setup_library/xPandMenu.css create mode 100644 backend/php/src/setup/setup_library/xPandMenu.js create mode 100644 backend/php/src/setup/setup_library/xPandMenu.php create mode 100644 backend/php/src/test.php create mode 100644 backend/python/properties/python.properties.json create mode 100644 backend/python/src/app.yaml create mode 100644 backend/python/src/clipperz.py create mode 100644 doc/install.php.txt create mode 100644 frontend/beta/css/clipperz/clipperz.css create mode 100644 frontend/beta/css/clipperz/compact.css create mode 100644 frontend/beta/css/clipperz/ie.css create mode 100644 frontend/beta/css/clipperz/ytheme-clipperz.css create mode 100644 frontend/beta/css/yui-extensions/basic-dialog.css create mode 100644 frontend/beta/css/yui-extensions/button.css create mode 100644 frontend/beta/css/yui-extensions/core.css create mode 100644 frontend/beta/css/yui-extensions/dd.css create mode 100644 frontend/beta/css/yui-extensions/grid.css create mode 100644 frontend/beta/css/yui-extensions/inline-editor.css create mode 100644 frontend/beta/css/yui-extensions/layout.css create mode 100644 frontend/beta/css/yui-extensions/qtips.css create mode 100644 frontend/beta/css/yui-extensions/reset-min.css create mode 100644 frontend/beta/css/yui-extensions/resizable.css create mode 100644 frontend/beta/css/yui-extensions/tabs.css create mode 100644 frontend/beta/css/yui-extensions/toolbar.css create mode 100644 frontend/beta/css/yui-extensions/tree.css create mode 100644 frontend/beta/css/yui-extensions/ytheme-aero.css create mode 100644 frontend/beta/css/yui-extensions/ytheme-gray.css create mode 100644 frontend/beta/css/yui-extensions/ytheme-vista.css create mode 100644 frontend/beta/css/yui/calendar.css create mode 100644 frontend/beta/css/yui/container.css create mode 100644 frontend/beta/css/yui/fonts.css create mode 100644 frontend/beta/css/yui/grids.css create mode 100644 frontend/beta/css/yui/logger.css create mode 100644 frontend/beta/css/yui/menu.css create mode 100644 frontend/beta/css/yui/reset.css create mode 100644 frontend/beta/css/yui/tree.css create mode 100644 frontend/beta/html/index_template.html create mode 100644 frontend/beta/images/cardBlockLowerBorder.gif create mode 100644 frontend/beta/images/cardBlockLowerRoundedCorner.gif create mode 100644 frontend/beta/images/cardFiltersSprite.gif create mode 100644 frontend/beta/images/cardsBlockRoundCorners.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/btn-sprite.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/close.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/close.png create mode 100644 frontend/beta/images/clipperz/basic-dialog/close_over.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/e-handle.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/hd-sprite.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/progress.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/progress2.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/s-handle.gif create mode 100644 frontend/beta/images/clipperz/basic-dialog/se-handle.gif create mode 100644 frontend/beta/images/default/basic-dialog/btn-sprite.gif create mode 100644 frontend/beta/images/default/basic-dialog/close.gif create mode 100644 frontend/beta/images/default/basic-dialog/e-handle.gif create mode 100644 frontend/beta/images/default/basic-dialog/hd-sprite.gif create mode 100644 frontend/beta/images/default/basic-dialog/progress.gif create mode 100644 frontend/beta/images/default/basic-dialog/progress2.gif create mode 100644 frontend/beta/images/default/basic-dialog/s-handle.gif create mode 100644 frontend/beta/images/default/basic-dialog/se-handle.gif create mode 100644 frontend/beta/images/directLogin/toggle.png create mode 100644 frontend/beta/images/directLoginBox.png create mode 100644 frontend/beta/images/entropyBackground.gif create mode 100644 frontend/beta/images/exportLogo.png create mode 100644 frontend/beta/images/favicon.ico create mode 100644 frontend/beta/images/flags/br.png create mode 100644 frontend/beta/images/flags/cn.png create mode 100644 frontend/beta/images/flags/de.png create mode 100644 frontend/beta/images/flags/en.png create mode 100644 frontend/beta/images/flags/es.png create mode 100644 frontend/beta/images/flags/it.png create mode 100644 frontend/beta/images/flags/jp.png create mode 100644 frontend/beta/images/flags/ru.png create mode 100644 frontend/beta/images/grippie.png create mode 100644 frontend/beta/images/importActiveStepsSeparator.png create mode 100644 frontend/beta/images/importStepsBackground.png create mode 100644 frontend/beta/images/importStepsLabelsBackground.png create mode 100644 frontend/beta/images/importStepsLeftLabelsBackground.png create mode 100644 frontend/beta/images/importStepsSeparator.png create mode 100644 frontend/beta/images/languageBox.png create mode 100644 frontend/beta/images/loginFormBox.png create mode 100644 frontend/beta/images/loginInfoBackground.png create mode 100644 frontend/beta/images/loginInfoInnerBackground.png create mode 100644 frontend/beta/images/logo.gif create mode 100644 frontend/beta/images/menubarSprite.gif create mode 100644 frontend/beta/images/newRecordPanelBackground.gif create mode 100644 frontend/beta/images/newRecordPanelBackground.png create mode 100644 frontend/beta/images/passwordAssistant.png create mode 100644 frontend/beta/images/read-only.gif create mode 100644 frontend/beta/images/read-only.png create mode 100644 frontend/beta/images/read-only_background.png create mode 100644 frontend/beta/images/recordFilterBackground.png create mode 100644 frontend/beta/images/rss.gif create mode 100644 frontend/beta/images/scrambledValue.gif create mode 100644 frontend/beta/images/scrambledValue.png create mode 100644 frontend/beta/images/smiles.gif create mode 100644 frontend/beta/images/smiles_big.gif create mode 100644 frontend/beta/images/smiles_small.gif create mode 100644 frontend/beta/images/test-database.png create mode 100644 frontend/beta/js/Bookmarklet.js create mode 100644 frontend/beta/js/BookmarkletHash.js create mode 100644 frontend/beta/js/Bookmarklet_IE.js create mode 100644 frontend/beta/js/Clipperz/Base.js create mode 100644 frontend/beta/js/Clipperz/ByteArray.js create mode 100644 frontend/beta/js/Clipperz/CSVProcessor.js create mode 100644 frontend/beta/js/Clipperz/Crypto/AES.js create mode 100644 frontend/beta/js/Clipperz/Crypto/Base.js create mode 100644 frontend/beta/js/Clipperz/Crypto/BigInt.js create mode 100644 frontend/beta/js/Clipperz/Crypto/BigInt_scoped.js create mode 100644 frontend/beta/js/Clipperz/Crypto/ECC.js create mode 100644 frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js create mode 100644 frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js create mode 100644 frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Point.js create mode 100644 frontend/beta/js/Clipperz/Crypto/ECC/BinaryField/Value.js create mode 100644 frontend/beta/js/Clipperz/Crypto/PRNG.js create mode 100644 frontend/beta/js/Clipperz/Crypto/RSA.js create mode 100644 frontend/beta/js/Clipperz/Crypto/SHA.js create mode 100644 frontend/beta/js/Clipperz/Crypto/SRP.js create mode 100644 frontend/beta/js/Clipperz/DOM.js create mode 100644 frontend/beta/js/Clipperz/Date.js create mode 100644 frontend/beta/js/Clipperz/KeePassExportProcessor.js create mode 100644 frontend/beta/js/Clipperz/NotificationCenter.js create mode 100644 frontend/beta/js/Clipperz/PM/BookmarkletProcessor.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/BaseComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Compact/CompactHeader.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Compact/CompactInterface.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Compact/LoginForm.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/CSVImport/CSVImportColumns.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/CSVImport/CSVImportFields.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/CSVImport/CSVImportHeader.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/CSVImport/CSVImportNotes.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/CSVImport/CSVImportTitle.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/CSVImportComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/ClipperzImportComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/ExcelImportComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/GenericImportComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/KeePassImportComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/MainComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/PasswordPlusImportComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Import/RoboFormImportComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/MessageBox.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/OTP/MainComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Panels/AccountPanel.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Panels/BasePanel.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Panels/ContactsPanel.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Panels/DataPanel.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Panels/LoginPanel.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Panels/LogoutPanel.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Panels/MainPanel.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Panels/ToolsPanel.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/PasswordEntropyDisplay.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/PasswordGenerator.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Printing/Footer.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Printing/Header.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/Printing/Record.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/AbstractComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/AbstractFieldSubComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/CreationWizard.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/DirectLoginBindingComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/DirectLoginComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/DirectLoginValueComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/DirectLoginsComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldButtonComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldDragHandler.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldLabelComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldTypeComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/FieldValueComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/HeaderComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/MainComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/NotesComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/RecordDetail/TitleComponent.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/TabPanel/TabPanelController.js create mode 100644 frontend/beta/js/Clipperz/PM/Components/TextFormField.js create mode 100644 frontend/beta/js/Clipperz/PM/Connection.js create mode 100644 frontend/beta/js/Clipperz/PM/Crypto.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/DirectLogin.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/DirectLoginBinding.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/DirectLoginInput.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/DirectLoginReference.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/Header.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/OneTimePassword.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/OneTimePasswordManager.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/Record.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/RecordField.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/RecordVersion.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/Statistics.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/User.js create mode 100644 frontend/beta/js/Clipperz/PM/DataModel/UserPreferences.js create mode 100644 frontend/beta/js/Clipperz/PM/Date.js create mode 100644 frontend/beta/js/Clipperz/PM/Main.js create mode 100644 frontend/beta/js/Clipperz/PM/Proxy.js create mode 100755 frontend/beta/js/Clipperz/PM/Proxy/Proxy.JSON.js create mode 100644 frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js create mode 100644 frontend/beta/js/Clipperz/PM/Proxy/Proxy.Offline.js create mode 100755 frontend/beta/js/Clipperz/PM/Proxy/Proxy.PHP.js create mode 100644 frontend/beta/js/Clipperz/PM/Proxy/Proxy.Test.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/MessagePanelConfigurations.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_de-DE.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_el-GR.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_en-CA.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_en-GB.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_en-US.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_es-ES.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_fr-FR.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_he-IL.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_it-IT.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_ja-JP.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_pt-BR.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_pt-PT.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_ru-RU.js create mode 100644 frontend/beta/js/Clipperz/PM/Strings/Strings_zh-CN.js create mode 100644 frontend/beta/js/Clipperz/PM/Toll.js create mode 100644 frontend/beta/js/Clipperz/Profile.js create mode 100644 frontend/beta/js/Clipperz/Set.js create mode 100644 frontend/beta/js/Clipperz/Signal.js create mode 100644 frontend/beta/js/Clipperz/Style.js create mode 100644 frontend/beta/js/Clipperz/YUI/Collapser.js create mode 100644 frontend/beta/js/Clipperz/YUI/DomHelper.js create mode 100644 frontend/beta/js/Clipperz/YUI/DomQuery.js create mode 100644 frontend/beta/js/Clipperz/YUI/Drawer.js create mode 100644 frontend/beta/js/Clipperz/YUI/IBLayoutManager.js create mode 100644 frontend/beta/js/Clipperz/YUI/IBLayoutRegion.js create mode 100644 frontend/beta/js/Clipperz/YUI/MessageBox.js create mode 100644 frontend/beta/js/JSON/json2.js create mode 100644 frontend/beta/js/MochiKit/Async.js create mode 100644 frontend/beta/js/MochiKit/Base.js create mode 100644 frontend/beta/js/MochiKit/Color.js create mode 100644 frontend/beta/js/MochiKit/Controls.js create mode 100644 frontend/beta/js/MochiKit/DOM.js create mode 100644 frontend/beta/js/MochiKit/DateTime.js create mode 100644 frontend/beta/js/MochiKit/DragAndDrop.js create mode 100644 frontend/beta/js/MochiKit/Format.js create mode 100644 frontend/beta/js/MochiKit/Iter.js create mode 100644 frontend/beta/js/MochiKit/Logging.js create mode 100644 frontend/beta/js/MochiKit/LoggingPane.js create mode 100644 frontend/beta/js/MochiKit/MochiKit.js create mode 100644 frontend/beta/js/MochiKit/MockDOM.js create mode 100644 frontend/beta/js/MochiKit/New.js create mode 100644 frontend/beta/js/MochiKit/Position.js create mode 100644 frontend/beta/js/MochiKit/Selector.js create mode 100644 frontend/beta/js/MochiKit/Signal.js create mode 100644 frontend/beta/js/MochiKit/Sortable.js create mode 100644 frontend/beta/js/MochiKit/Style.js create mode 100644 frontend/beta/js/MochiKit/Test.js create mode 100644 frontend/beta/js/MochiKit/Visual.js create mode 100644 frontend/beta/js/MochiKit/__package__.js create mode 100644 frontend/beta/js/YUI-extensions/Bench.js create mode 100644 frontend/beta/js/YUI-extensions/CSS.js create mode 100644 frontend/beta/js/YUI-extensions/CompositeElement.js create mode 100644 frontend/beta/js/YUI-extensions/CustomTagReader.js create mode 100644 frontend/beta/js/YUI-extensions/Date.js create mode 100644 frontend/beta/js/YUI-extensions/DomHelper.js create mode 100644 frontend/beta/js/YUI-extensions/Element.js create mode 100644 frontend/beta/js/YUI-extensions/EventManager.js create mode 100644 frontend/beta/js/YUI-extensions/JSON.js create mode 100644 frontend/beta/js/YUI-extensions/KeyMap.js create mode 100644 frontend/beta/js/YUI-extensions/Layer.js create mode 100644 frontend/beta/js/YUI-extensions/MixedCollection.js create mode 100644 frontend/beta/js/YUI-extensions/State.js create mode 100644 frontend/beta/js/YUI-extensions/UpdateManager.js create mode 100644 frontend/beta/js/YUI-extensions/anim/Actor.js create mode 100644 frontend/beta/js/YUI-extensions/anim/Animator.js create mode 100644 frontend/beta/js/YUI-extensions/data/AbstractDataModel.js create mode 100644 frontend/beta/js/YUI-extensions/data/DefaultDataModel.js create mode 100644 frontend/beta/js/YUI-extensions/data/JSONDataModel.js create mode 100644 frontend/beta/js/YUI-extensions/data/LoadableDataModel.js create mode 100644 frontend/beta/js/YUI-extensions/data/Tree.js create mode 100644 frontend/beta/js/YUI-extensions/data/XMLDataModel.js create mode 100644 frontend/beta/js/YUI-extensions/dd/DragSource.js create mode 100644 frontend/beta/js/YUI-extensions/dd/DragZone.js create mode 100644 frontend/beta/js/YUI-extensions/dd/DropTarget.js create mode 100644 frontend/beta/js/YUI-extensions/dd/DropZone.js create mode 100644 frontend/beta/js/YUI-extensions/dd/Registry.js create mode 100644 frontend/beta/js/YUI-extensions/dd/ScrollManager.js create mode 100644 frontend/beta/js/YUI-extensions/dd/StatusProxy.js create mode 100644 frontend/beta/js/YUI-extensions/grid/AbstractColumnModel.js create mode 100644 frontend/beta/js/YUI-extensions/grid/DefaultColumnModel.js create mode 100644 frontend/beta/js/YUI-extensions/grid/EditorGrid.js create mode 100644 frontend/beta/js/YUI-extensions/grid/EditorSelectionModel.js create mode 100644 frontend/beta/js/YUI-extensions/grid/Grid.js create mode 100644 frontend/beta/js/YUI-extensions/grid/GridDD.js create mode 100644 frontend/beta/js/YUI-extensions/grid/GridView.js create mode 100644 frontend/beta/js/YUI-extensions/grid/PagedGridView.js create mode 100644 frontend/beta/js/YUI-extensions/grid/SelectionModel.js create mode 100644 frontend/beta/js/YUI-extensions/grid/editor/CellEditor.js create mode 100644 frontend/beta/js/YUI-extensions/grid/editor/CheckboxEditor.js create mode 100644 frontend/beta/js/YUI-extensions/grid/editor/DateEditor.js create mode 100644 frontend/beta/js/YUI-extensions/grid/editor/NumberEditor.js create mode 100644 frontend/beta/js/YUI-extensions/grid/editor/SelectEditor.js create mode 100644 frontend/beta/js/YUI-extensions/grid/editor/TextEditor.js create mode 100644 frontend/beta/js/YUI-extensions/layout/BasicLayoutRegion.js create mode 100644 frontend/beta/js/YUI-extensions/layout/BorderLayout.js create mode 100644 frontend/beta/js/YUI-extensions/layout/BorderLayoutRegions.js create mode 100644 frontend/beta/js/YUI-extensions/layout/ContentPanels.js create mode 100644 frontend/beta/js/YUI-extensions/layout/LayoutManager.js create mode 100644 frontend/beta/js/YUI-extensions/layout/LayoutRegion.js create mode 100644 frontend/beta/js/YUI-extensions/layout/LayoutStateManager.js create mode 100644 frontend/beta/js/YUI-extensions/layout/SplitLayoutRegion.js create mode 100644 frontend/beta/js/YUI-extensions/tree/AsyncTreeNode.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreeDragZone.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreeDropZone.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreeFilter.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreeLoader.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreeNode.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreeNodeUI.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreePanel.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreeSelectionModel.js create mode 100644 frontend/beta/js/YUI-extensions/tree/TreeSorter.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/BasicDialog.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/Button.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/DatePicker.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/InlineEditor.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/MessageBox.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/QuickTips.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/Resizable.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/SplitBar.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/TabPanel.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/TaskPanel.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/TemplateView.js create mode 100644 frontend/beta/js/YUI-extensions/widgets/Toolbar.js create mode 100644 frontend/beta/js/YUI-extensions/yutil.js create mode 100644 frontend/beta/js/YUI/animation.js create mode 100644 frontend/beta/js/YUI/autocomplete.js create mode 100644 frontend/beta/js/YUI/calendar.js create mode 100644 frontend/beta/js/YUI/connection.js create mode 100644 frontend/beta/js/YUI/container.js create mode 100644 frontend/beta/js/YUI/dom.js create mode 100644 frontend/beta/js/YUI/dragdrop.js create mode 100644 frontend/beta/js/YUI/event.js create mode 100644 frontend/beta/js/YUI/logger.js create mode 100644 frontend/beta/js/YUI/menu.js create mode 100644 frontend/beta/js/YUI/slider.js create mode 100644 frontend/beta/js/YUI/tabview.js create mode 100644 frontend/beta/js/YUI/treeview.js create mode 100644 frontend/beta/js/YUI/yahoo.js create mode 100644 frontend/beta/properties/beta.properties.json create mode 100644 frontend/beta/properties/creditsAndCopyrights.txt create mode 100644 frontend/gamma/css/clipperz/clipperz.css create mode 100644 frontend/gamma/css/clipperz/compact.css create mode 100644 frontend/gamma/css/clipperz/iPhone.css create mode 100644 frontend/gamma/css/clipperz/ie.css create mode 100644 frontend/gamma/graphics/CoverActions.opacity create mode 100644 frontend/gamma/graphics/Features.opacity create mode 100644 frontend/gamma/graphics/GridSorting.opacity create mode 100644 frontend/gamma/graphics/Logo.opacity create mode 100644 frontend/gamma/graphics/Marks.opacity create mode 100644 frontend/gamma/graphics/RegisterButton.opacity create mode 100644 frontend/gamma/graphics/Star.opacity create mode 100644 frontend/gamma/graphics/Tips.opacity create mode 100644 frontend/gamma/html/exitPage_template.html create mode 100644 frontend/gamma/html/index_template.html create mode 100644 frontend/gamma/html/mobile_template.html create mode 100644 frontend/gamma/js/Bookmarklet.js create mode 100644 frontend/gamma/js/BookmarkletHash.js create mode 100644 frontend/gamma/js/Bookmarklet_1.js create mode 100644 frontend/gamma/js/Bookmarklet_2.js create mode 100644 frontend/gamma/js/Bookmarklet_IE.js create mode 100644 frontend/gamma/js/Clipperz/Async.js create mode 100644 frontend/gamma/js/Clipperz/Base.js create mode 100644 frontend/gamma/js/Clipperz/ByteArray.js create mode 100644 frontend/gamma/js/Clipperz/CSVProcessor.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/AES.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/Base.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/BigInt.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/BigInt_scoped.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Curve.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Point.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/ECC/BinaryField/Value.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/ECC/StandardCurves.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/PRNG.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/RSA.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/SHA.js create mode 100644 frontend/gamma/js/Clipperz/Crypto/SRP.js create mode 100644 frontend/gamma/js/Clipperz/DOM.js create mode 100644 frontend/gamma/js/Clipperz/Date.js create mode 100644 frontend/gamma/js/Clipperz/KeePassExportProcessor.js create mode 100644 frontend/gamma/js/Clipperz/KeyValueObjectStore.js create mode 100644 frontend/gamma/js/Clipperz/Logging.js create mode 100644 frontend/gamma/js/Clipperz/PM/BookmarkletProcessor.js create mode 100644 frontend/gamma/js/Clipperz/PM/Connection.js create mode 100644 frontend/gamma/js/Clipperz/PM/Crypto.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/DirectLogin.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginBinding.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginFormValue.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/DirectLoginInput.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/OneTimePassword.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.Field.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/Record.Version.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/Record.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Legacy.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/User.Header.Preferences.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js create mode 100644 frontend/gamma/js/Clipperz/PM/DataModel/User.js create mode 100644 frontend/gamma/js/Clipperz/PM/Date.js create mode 100644 frontend/gamma/js/Clipperz/PM/Proxy.js create mode 100755 frontend/gamma/js/Clipperz/PM/Proxy/Proxy.JSON.js create mode 100644 frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js create mode 100644 frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Offline.js create mode 100644 frontend/gamma/js/Clipperz/PM/Proxy/Proxy.Test.js create mode 100644 frontend/gamma/js/Clipperz/PM/Strings.js create mode 100644 frontend/gamma/js/Clipperz/PM/Strings/MessagePanelConfigurations.js create mode 100644 frontend/gamma/js/Clipperz/PM/Strings/Strings_defaults.js create mode 100644 frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js create mode 100644 frontend/gamma/js/Clipperz/PM/Toll.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/download.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/CoverActions/look.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/directLogin.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/protect.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/share.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Features/store.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/GraphicFunctions.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Logo/normal.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/exclamationMark.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/info.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Marks/questionMark.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/RegisterButton/normal.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Star/normal.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/close.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Canvas/Tips/open.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/BaseComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/Button.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/ComponentSlot.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/FaviconComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/ProgressBar.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/TabPanelComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/Tooltip.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Components/TranslatorWidget.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/ProgressBarController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/TabPanelController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Common/Controllers/WizardController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Compact/MainController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/AccountPanel.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/AppPage.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/BookmarkletComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/ColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/DataPanel.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/DateColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/FaviconColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/GridComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/ImageColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/LinkColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginForm.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginPage.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/LoginProgress.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/Page.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageHeader.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/PasswordTooltip.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/RulerComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/TabSidePanel.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/TextColumnManager.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/ToolsPanel.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Components/UserInfoBox.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/AppController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardDialogController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/CardsController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/FilterController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/GridController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/LoginController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/MainController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardDetail.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/CardList.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/iPhone/Components/LoginForm.js create mode 100644 frontend/gamma/js/Clipperz/PM/UI/iPhone/Controllers/MainController.js create mode 100644 frontend/gamma/js/Clipperz/Set.js create mode 100644 frontend/gamma/js/Clipperz/Signal.js create mode 100644 frontend/gamma/js/Clipperz/Style.js create mode 100644 frontend/gamma/js/Clipperz/Visual.js create mode 100644 frontend/gamma/js/Clipperz/YUI/DomHelper.js create mode 100644 frontend/gamma/js/Clipperz/YUI/DomQuery.js create mode 100644 frontend/gamma/js/Clipperz/YUI/Utils.js create mode 100644 frontend/gamma/js/JSON/json2.js create mode 100644 frontend/gamma/js/MochiKit/Async.js create mode 100644 frontend/gamma/js/MochiKit/Base.js create mode 100644 frontend/gamma/js/MochiKit/Color.js create mode 100644 frontend/gamma/js/MochiKit/DOM.js create mode 100644 frontend/gamma/js/MochiKit/DateTime.js create mode 100644 frontend/gamma/js/MochiKit/DragAndDrop.js create mode 100644 frontend/gamma/js/MochiKit/Format.js create mode 100644 frontend/gamma/js/MochiKit/Iter.js create mode 100644 frontend/gamma/js/MochiKit/Logging.js create mode 100644 frontend/gamma/js/MochiKit/LoggingPane.js create mode 100644 frontend/gamma/js/MochiKit/MochiKit.js create mode 100644 frontend/gamma/js/MochiKit/MockDOM.js create mode 100644 frontend/gamma/js/MochiKit/Position.js create mode 100644 frontend/gamma/js/MochiKit/Selector.js create mode 100644 frontend/gamma/js/MochiKit/Signal.js create mode 100644 frontend/gamma/js/MochiKit/Sortable.js create mode 100644 frontend/gamma/js/MochiKit/Style.js create mode 100644 frontend/gamma/js/MochiKit/Test.js create mode 100644 frontend/gamma/js/MochiKit/Text.js create mode 100644 frontend/gamma/js/MochiKit/Visual.js create mode 100644 frontend/gamma/js/MochiKit/__package__.js create mode 100644 frontend/gamma/js/main.js create mode 100644 frontend/gamma/js/main_iPhone.js create mode 100644 frontend/gamma/properties/creditsAndCopyrights.txt create mode 100644 frontend/gamma/properties/gamma.properties.json create mode 100644 frontend/gamma/properties/mobile.properties.json create mode 100644 frontend/gamma/tests/SimpleTest/SimpleTest.Async.js create mode 100644 frontend/gamma/tests/SimpleTest/SimpleTest.js create mode 100644 frontend/gamma/tests/SimpleTest/TestRunner.js create mode 100644 frontend/gamma/tests/SimpleTest/test.css create mode 100755 frontend/gamma/tests/index.html create mode 100644 frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css create mode 100644 frontend/gamma/tests/tests/Bookmarklet/Fail.html create mode 100644 frontend/gamma/tests/tests/Bookmarklet/Twitter.html create mode 100755 frontend/gamma/tests/tests/Bookmarklet/ZeroClipboard.swf create mode 100644 frontend/gamma/tests/tests/Bookmarklet/background.png create mode 100644 frontend/gamma/tests/tests/Bookmarklet/close.png create mode 100644 frontend/gamma/tests/tests/Bookmarklet/close_selected.png create mode 100644 frontend/gamma/tests/tests/Bookmarklet/copy.png create mode 100644 frontend/gamma/tests/tests/Bookmarklet/copy_selected.png create mode 100644 frontend/gamma/tests/tests/Bookmarklet/error.png create mode 100644 frontend/gamma/tests/tests/Bookmarklet/hint.png create mode 100644 frontend/gamma/tests/tests/Bookmarklet/index.html create mode 100644 frontend/gamma/tests/tests/Bookmarklet/info.png create mode 100644 frontend/gamma/tests/tests/Clipperz/Async.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Async.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/Base.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Base.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/ByteArray.html create mode 100644 frontend/gamma/tests/tests/Clipperz/ByteArray.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/AES.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/Base.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/index.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js create mode 100644 frontend/gamma/tests/tests/Clipperz/DOM.html create mode 100644 frontend/gamma/tests/tests/Clipperz/DOM.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/Date.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Date.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js create mode 100644 frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html create mode 100644 frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html create mode 100644 frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Connection.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Crypto.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Date.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Date.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Proxy.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Toll.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/UI/index.html create mode 100644 frontend/gamma/tests/tests/Clipperz/PM/index.html create mode 100644 frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Set.html create mode 100644 frontend/gamma/tests/tests/Clipperz/Set.test.js create mode 100644 frontend/gamma/tests/tests/Clipperz/index.html create mode 100644 frontend/gamma/tests/tests/Clipperz/index_googleCode.html create mode 100644 frontend/gamma/tests/tests/Clipperz/index_testECC.html create mode 100644 frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js create mode 100644 frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js create mode 100644 frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js create mode 100644 frontend/gamma/tests/tests/Components/CardDialogEditing/index.html create mode 100644 frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js create mode 100644 frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js create mode 100644 frontend/gamma/tests/tests/Components/CardDialogNew/index.html create mode 100644 frontend/gamma/tests/tests/Components/FullApp/README.txt create mode 100644 frontend/gamma/tests/tests/Components/FullApp/User.data.js create mode 100644 frontend/gamma/tests/tests/Components/FullApp/index.html create mode 100644 frontend/gamma/tests/tests/Components/FullApp/main_test.js create mode 100644 frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js create mode 100644 frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js create mode 100644 frontend/gamma/tests/tests/Components/GridLayout/User.data.js create mode 100644 frontend/gamma/tests/tests/Components/GridLayout/index.html create mode 100644 frontend/gamma/tests/tests/Components/GridLayout/test.css create mode 100644 frontend/gamma/tests/tests/Components/ProgressBar/index.html create mode 100644 frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js create mode 100644 frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html create mode 100644 frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js create mode 100644 frontend/gamma/tests/tests/Components/Tooltips/index.html create mode 100644 frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js create mode 100644 frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js create mode 100644 frontend/gamma/tests/tests/Components/UnlockPassword/index.html create mode 100644 frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js create mode 100644 frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js create mode 100644 frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html create mode 100644 frontend/gamma/tests/tests/index.html create mode 100644 properties/license.txt create mode 100755 scripts/build create mode 100644 scripts/builder/backendBuilder.py create mode 100644 scripts/builder/cssmin.py create mode 100644 scripts/builder/frontendBuilder.py create mode 100644 scripts/builder/jsmin.py create mode 100755 scripts/builder/main.py create mode 100644 scripts/builder/phpBuilder.py create mode 100644 scripts/builder/pythonBuilder.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6e317a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target +*.pyc \ No newline at end of file diff --git a/LICENCE.txt b/LICENCE.txt new file mode 100644 index 0000000..2def0e8 --- /dev/null +++ b/LICENCE.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..be11d8c --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +# Clipperz Password Manager # + +This is the code of [Clipperz][clipperz] [Password Manager][password-manager] + +More details + +ALL the code included in this project, if not otherwise stated, is released with +the AGPL licence (see LICENCE.txt), and all rights are reserved to Clipperz src. + + +## CONTRIBUTIONS ## + +Clipperz is very interested in accepting patches in the form of pull requests, but in +order to avoid jeopardizing the ownership of the code base, we will require every +developer to sign Clipperz [Contribution Agreement][contributor-agreement] + + +## BUILDING ## + +In order to build the deployable version, you need to invoke the following command: + + ./scripts/build clean install debug --frontends beta --backends php + + +The output will be available in the `target` folder, with a separate folder for each build backend (initially this will be just a `php` folder). +The script, invoked with these parameters, will build both the full version (`install` -> index.html) and the debug version (index_debug.html) of the /beta frontend using the PHP backend. + +At the moment this is the only combination that (kind of) works, but this script will be gradually extended to be able to build also the /gamma frontend (whose code is already in the repository) and possibly also other backends (Python AppEngine being the very first candidate, and a JavaScript version per node.js another interesting option) + + +## INSTALLING ## + +### PHP + MySQL backend ### + +At the moment the only backend that the build script can successfully create is the PHP + MySQL one. + +#### 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:////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 bilding the PHP backend may be found in the `doc/install.php.txt` file. + + +## WARNING ## + +The resulting application has not been fully tested, so there may be still problems due to the new build script or some other changes that were done due to the new repository structure. So, for the moment, **use it at your own risk!** + + +[clipperz]: http://www.clipperz.com +[password-manager]: https://www.clipperz.com/beta +[contributor-agreement]: http://www.clipperz.com/open_source/contributor_agreement +[pog]: http://www.phpobjectgenerator.com/ \ No newline at end of file diff --git a/backend/php/properties/php.properties.json b/backend/php/properties/php.properties.json new file mode 100644 index 0000000..32d5084 --- /dev/null +++ b/backend/php/properties/php.properties.json @@ -0,0 +1,4 @@ +{ + "request.path": "../index.php", + "should.pay.toll": "false" +} \ No newline at end of file diff --git a/backend/php/src/configuration.php b/backend/php/src/configuration.php new file mode 100644 index 0000000..291e3a1 --- /dev/null +++ b/backend/php/src/configuration.php @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/backend/php/src/dump.php b/backend/php/src/dump.php new file mode 100644 index 0000000..d4e8544 --- /dev/null +++ b/backend/php/src/dump.php @@ -0,0 +1,103 @@ +Get($_SESSION["userId"]); + $records = $user->GetRecordList(); + + $recordString = ""; + $isFirstRecord = true; + + $c = count($records); + for ($i=0; $i<$c; $i++) { + $currentRecord = $records[$i]; + $recordVersions = $currentRecord->GetRecordversionList(); + + + if ($isFirstRecord == true) { + $isFirstRecord = false; + } else { + $recordString = $recordString . ",\n"; + } + + $versionString = ""; + $isFirstVersion = true; + + $cc = count($recordVersions); + for ($ii=0; $ii<$cc; $ii++) { + $currentVersion = $recordVersions[$ii]; + + if ($isFirstVersion == true) { + $isFirstVersion = false; + } else { + $versionString = $versionString . ",\n"; + } + + $versionsString = $versionString . "\t\t\t\t\t\t'" . $currentVersion->reference . "': {\n" . + "\t\t\t\t\t\t\theader: '" . $currentVersion->header . "',\n" . + "\t\t\t\t\t\t\tdata: '" . $currentVersion->data . "',\n" . + "\t\t\t\t\t\t\tversion: '" . $currentVersion->version . "',\n" . + "\t\t\t\t\t\t\tcreationDate: '" . $currentVersion->creation_date . "',\n" . + "\t\t\t\t\t\t\tupdateDate: '" . $currentVersion->update_date . "',\n" . + "\t\t\t\t\t\t\taccessDate: '" . $currentVersion->access_date . "'\n" . + "\t\t\t\t\t\t}"; + } + + $recordString = $recordString . "\t\t\t\t'" . $currentRecord->reference . "': {\n" . + "\t\t\t\t\tdata: '" . $currentRecord->data . "',\n" . + "\t\t\t\t\tversion: '" . $currentRecord->version . "',\n" . + "\t\t\t\t\tcreationDate: '" . $currentRecord->creation_date . "',\n" . + "\t\t\t\t\tupdateDate: '" . $currentRecord->update_date . "',\n" . + "\t\t\t\t\taccessDate: '" . $currentRecord->access_date . "',\n" . + "\t\t\t\t\tcurrentVersion: '" . $currentVersion->reference . "',\n" . + "\t\t\t\t\tversions: {\n" . + $versionsString . "\n" . + "\t\t\t\t\t}\n" . + "\t\t\t\t}"; + } + + + $data = "_clipperz_dump_data_ = {\n" . + "\tusers:{\n" . + "\t\t'catchAllUser': {\n" . + "\t\t\t__masterkey_test_value__: 'masterkey',\n" . + "\t\t\ts: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',\n" . + "\t\t\tv: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'\n" . + "\t\t},\n" . + "\t\t'" . $user->username . "': {\n" . + "\t\t\ts: '" . $user->srp_s . "',\n" . + "\t\t\tv: '" . $user->srp_v . "',\n" . + "\t\t\tversion: '" . $user->auth_version . "',\n" . + "\t\t\tmaxNumberOfRecords: '" . "100" . "',\n" . + "\t\t\tuserDetails: '" . $user->header . "',\n" . + "\t\t\tstatistics: '" . $user->statistics . "',\n" . + "\t\t\tuserDetailsVersion: '" . $user->version . "',\n" . + "\t\t\trecords: {\n" . + $recordString . "\n" . + "\t\t\t}\n" . + "\t\t}\n" . + "\t}\n" . + "}\n" . + "\n" . + "Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.Offline();\n" . + "Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();" . + "\n"; + + session_write_close(); + + echo str_replace("/*offline_data_placeholder*/", $data, $htmlContent); +?> \ No newline at end of file diff --git a/backend/php/src/index.php b/backend/php/src/index.php new file mode 100644 index 0000000..eb3d75a --- /dev/null +++ b/backend/php/src/index.php @@ -0,0 +1,744 @@ +decode($content); + } +} + +if ( !function_exists('json_encode') ) { + function json_encode($content) { + require_once 'json/JSON.php'; + $json = new Services_JSON; + + return $json->encode($content); + } +} + +//----------------------------------------------------------------------------- +// 'dec2base', 'base2dec' and 'digits' are functions found on the following +// PHP manual page: http://ch2.php.net/manual/en/ref.bc.php +// + +function dec2base($dec, $base, $digits=FALSE) { + if ($base<2 or $base>256) { + die("Invalid Base: ".$base); + } + + bcscale(0); + $value=""; + if (!$digits) { + $digits = digits($base); + } + + while ($dec > $base-1) { + $rest = bcmod($dec, $base); + $dec = bcdiv($dec, $base); + $value = $digits[$rest].$value; + } + + $value=$digits[intval($dec)].$value; + + return (string)$value; +} + +//............................................................................. + +// convert another base value to its decimal value +function base2dec($value, $base, $digits=FALSE) { + if ($base<2 or $base>256) { + die("Invalid Base: ".$base); + } + + bcscale(0); + if ($base<37) { + $value=strtolower($value); + } + + if (!$digits) { + $digits=digits($base); + } + + $size = strlen($value); + $dec="0"; + for ($loop=0; $loop<$size; $loop++) { + $element = strpos($digits, $value[$loop]); + $power = bcpow($base, $size-$loop-1); + $dec = bcadd($dec, bcmul($element,$power)); + } + + return (string)$dec; +} + +//............................................................................. + +function digits($base) { + if ($base>64) { + $digits=""; + for ($loop=0; $loop<256; $loop++) { + $digits.=chr($loop); + } + } else { + $digits ="0123456789abcdefghijklmnopqrstuvwxyz"; + $digits.="ABCDEFGHIJKLMNOPQRSTUVWXYZ-_"; + } + + $digits=substr($digits,0,$base); + + return (string)$digits; +} + +//----------------------------------------------------------------------------- + +function clipperz_hash($value) { + return hash("sha256", hash("sha256", $value, true)); +} + +//----------------------------------------------------------------------------- + +function clipperz_randomSeed() { + $result; + + srand((double) microtime()*1000000); + $result = ""; + + while(strlen($result) < 64) { + $result = $result.dec2base(rand(), 16); + } + + $result = substr($result, 0, 64); + + return $result; +} + +//----------------------------------------------------------------------------- + +function updateUserCredentials($parameters, &$user) { + $user->username = $parameters["C"]; + $user->srp_s = $parameters["s"]; + $user->srp_v = $parameters["v"]; + $user->auth_version = $parameters["version"]; +} + +function updateUserData($parameters, &$user) { + $user->header = $parameters["header"]; + $user->statistics = $parameters["statistics"]; + $user->version = $parameters["version"]; + $user->lock = $parameters["lock"]; +} + +function updateRecordData($parameters, &$record, &$recordVersion) { + $recordData = $parameters["record"]; + $record->reference = $recordData["reference"]; + $record->data = $recordData["data"]; + $record->version = $recordData["version"]; + + $recordVersionData = $parameters["currentRecordVersion"]; + $recordVersion->reference = $recordVersionData ["reference"]; + $recordVersion->data = $recordVersionData ["data"]; + $recordVersion->version = $recordVersionData ["version"]; + $recordVersion->previous_version_id = $recordVersionData ["previousVersion"]; + $recordVersion->previous_version_key = $recordVersionData ["previousVersionKey"]; +} + +//----------------------------------------------------------------------------- + +function updateOTPStatus(&$otp, $status) { + $otpStatus = new onetimepasswordstatus(); + $selectedStatuses = $otpStatus->GetList(array(array("code", "=", $status))); + $otpStatus = $selectedStatuses[0]; + $otp->SetOnetimepasswordstatus($otpStatus); +} + +function updateOTP($parameters, &$otp, $status) { + $otp->reference = $parameters["reference"]; + $otp->key = $parameters["key"]; + $otp->key_checksum = $parameters["keyChecksum"]; + $otp->data = $parameters["data"]; + $otp->version = $parameters["version"]; + + updateOTPStatus($otp, $status); +} + +function resetOTP(&$otp, $status) { + $otp->data = ""; + updateOTPStatus($otp, $status); + $otp->Save(); +} + +//----------------------------------------------------------------------------- + +function fixOTPStatusTable() { + $otpStatus = new onetimepasswordstatus(); + $otpStatusList = $otpStatus->GetList(); + if (count($otpStatusList) != 4) { + $otpStatus->DeleteList(); + + $otpStatus->code = "ACTIVE"; $otpStatus->name = "Active"; $otpStatus->description = "Active"; $otpStatus->SaveNew(); + $otpStatus->code = "REQUESTED"; $otpStatus->name = "Requested"; $otpStatus->description = "Requested"; $otpStatus->SaveNew(); + $otpStatus->code = "USED"; $otpStatus->name = "Used"; $otpStatus->description = "Used"; $otpStatus->SaveNew(); + $otpStatus->code = "DISABLED"; $otpStatus->name = "Disabled"; $otpStatus->description = "Disabled"; $otpStatus->SaveNew(); + } +} + +//----------------------------------------------------------------------------- + +function arrayContainsValue($array, $value) { + $object = NULL; + for ($i=0; $iSave(); + + $result["lock"] = $user->lock; + $result["result"] = "done"; + } + break; + + case "handshake": +error_log("handshake"); + $srp_g = "2"; + $srp_n = base2dec("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16); + + $message = $parameters["message"]; + + //============================================================= + if ($message == "connect") { + $user= new user(); + $_SESSION["C"] = $parameters["parameters"]["C"]; + $_SESSION["A"] = $parameters["parameters"]["A"]; + + $userList = $user->GetList(array(array("username", "=", $_SESSION["C"]))); + + if (count($userList) == 1) { + $currentUser = $userList[ 0 ]; + + if (array_key_exists("otpId", $_SESSION)) { + $otp = new onetimepassword(); + $otp = $otp->Get($_SESSION["otpId"]); + + if ($otp->GetUser()->userId != $currentUser->userId) { + throw new Exception("User missmatch between the current session and 'One Time Password' user"); + } else if ($otp->GetOnetimepasswordstatus()->code != "REQUESTED") { + throw new Exception("Tring to use an 'One Time Password' in the wrong state"); + } + + resetOTP($otp, "USED"); + $result["oneTimePassword"] = $otp->reference; + } + + $_SESSION["s"] = $currentUser->srp_s; + $_SESSION["v"] = $currentUser->srp_v; + $_SESSION["userId"] = $currentUser->userId; + } else { + $_SESSION["s"] = "112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00"; + $_SESSION["v"] = "112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00"; + } + + $_SESSION["b"] = clipperz_randomSeed(); +// $_SESSION["b"] = "5761e6c84d22ea3c5649de01702d60f674ccfe79238540eb34c61cd020230c53"; + $_SESSION["B"] = dec2base(bcadd(base2dec($_SESSION["v"], 16), bcpowmod($srp_g, base2dec($_SESSION["b"], 16), $srp_n)), 16); + + $result["s"] = $_SESSION["s"]; + $result["B"] = $_SESSION["B"]; + + //============================================================= + } else if ($message == "credentialCheck") { +error_log("credentialCheck"); + $u = clipperz_hash(base2dec($_SESSION["B"],16)); + $A = base2dec($_SESSION["A"], 16); + $S = bcpowmod(bcmul($A, bcpowmod(base2dec($_SESSION["v"], 16), base2dec($u, 16), $srp_n)), base2dec($_SESSION["b"], 16), $srp_n); + $K = clipperz_hash($S); + $M1 = clipperz_hash($A.base2dec($_SESSION["B"],16).$K); + +//$result["B"] = $_SESSION["B"]; +//$result["u"] = $u; +//$result["A"] = $A; +//$result["S"] = $S; +//$result["K"] = $K; +//$result["M1"] = $M1; +//$result["_M1"] = $parameters["parameters"]["M1"]; + + if ($M1 == $parameters["parameters"]["M1"]) { + $_SESSION["K"] = $K; + $M2 = clipperz_hash($A.$M1.$K); + + $result["M2"] = $M2; + $result["connectionId"] = ""; + $result["loginInfo"] = array(); + $result["loginInfo"]["latest"] = array(); + $result["loginInfo"]["current"] = array(); + $result["offlineCopyNeeded"] = "false"; + $result["lock"] = "----"; + } else { + $result["error"] = "?"; + } + //============================================================= + } else if ($message == "oneTimePassword") { +error_log("oneTimePassword"); +//{ +// "message":"oneTimePassword", +// "version":"0.2", +// "parameters":{ +// "oneTimePasswordKey":"06dfa7f428081f8b2af98b0895e14e18af90b0ef2ff32828e55cc2ac6b24d29b", +// "oneTimePasswordKeyChecksum":"60bcba3f72e56f6bb3f0ff88509b9a0e5ec730dfa71daa4c1e892dbd1b0c360d" +// } +//} + $otp = new onetimepassword(); + $otpList = $otp->GetList(array(array("key", "=", $parameters["parameters"]["oneTimePasswordKey"]))); + + if (count($otpList) == 1) { + $currentOtp = $otpList[0]; + + if ($currentOtp->GetOnetimepasswordstatus()->code == "ACTIVE") { + if ($currentOtp->key_checksum == $parameters["parameters"]["oneTimePasswordKeyChecksum"]) { + $_SESSION["userId"] = $currentOtp->GetUser()->userId; + $_SESSION["otpId"] = $currentOtp->onetimepasswordId; + + $result["data"] = $currentOtp->data; + $result["version"] = $currentOtp->version; + + resetOTP($currentOtp, "REQUESTED"); + } else { + resetOTP($currentOtp, "DISABLED"); + throw new Exception("The requested One Time Password has been disabled, due to a wrong keyChecksum"); + } + } else { + throw new Exception("The requested One Time Password was not active"); + } + } else { + throw new Exception("The requested One Time Password has not been found"); + } + + //============================================================= + } + + break; + + case "message": +error_log("message"); + if ($parameters["srpSharedSecret"] == $_SESSION["K"]) { + $message = $parameters["message"]; + + //============================================================= + if ($message == "getUserDetails") { +//{"message":"getUserDetails", "srpSharedSecret":"f18e5cf7c3a83b67d4db9444af813ee48c13daf4f8f6635397d593e52ba89a08", "parameters":{}} + $user = new user(); + $user = $user->Get($_SESSION["userId"]); + + $result["header"] = $user->header; + $result["statistics"] = $user->statistics; + $result["version"] = $user->version; + + //============================================================= + } else if ($message == "addNewRecords") { +/* +//{ +// "message":"addNewRecords", +// "srpSharedSecret":"b58fdf62acebbcb67f63d28c0437f166069f45690c648cd4376a792ae7a325f7", +// "parameters":{ +// "records":[ +// { +// "record":{ +// "reference":"fda703707fee1fff42443124cd0e705f5bea0ac601758d81b2e832705339a610", +// "data":"OBSGtcb6blXq/xaYG.....4EqlQqgAvITN", +// "version":"0.3" +// }, +// "currentRecordVersion":{ +// "reference":"83ad301525c18f2afd72b6ac82c0a713382e1ef70ac69935ca7e2869dd4ff980", +// "recordReference":"fda703707fee1fff42443124cd0e705f5bea0ac601758d81b2e832705339a610", +// "data":"NXJ5jiZhkd0CMiwwntAq....1TjjF+SGfE=", +// "version":"0.3", +// "previousVersion":"3e174a86afc322271d8af28bc062b0f1bfd7344fad01212cd08b2757c4b199c4", +// "previousVersionKey":"kozaaGCzXWr71LbOKu6Z3nz520V..5U85tSBvb+u44twttv54Kw==" +// } +// } +// ], +// "user":{ +// "header":"{\"reco...ersion\":\"0.1\"}", +// "statistics":"rKI6nR6iqggygQJ3SQ58bFUX", +// "version":"0.3", +// "lock":"----" +// } +// } +//} +*/ + $user = new user(); + $record = new record(); + $recordVersion = new recordversion(); + + $user = $user->Get($_SESSION["userId"]); + updateUserData($parameters["parameters"]["user"], $user); + + $recordParameterList = $parameters["parameters"]["records"]; + $c = count($recordParameterList); + for ($i=0; $i<$c; $i++) { + updateRecordData($recordParameterList[$i], $record, $recordVersion); + + $record->SaveNew(); + $recordVersion->SaveNew(); + + $record->AddRecordversion($recordVersion); + $user->AddRecord($record); + + $record->Save(); + $recordVersion->Save(); + } + + $user->Save(); + + $result["lock"] = $user->lock; + $result["result"] = "done"; + + //============================================================= + } else if ($message == "getRecordDetail") { +//{ +// "message":"getRecordDetail", +// "srpSharedSecret":"4c00dcb66a9f2aea41a87e4707c526874e2eb29cc72d2c7086837e53d6bf2dfe", +// "parameters":{ +// "reference":"740009737139a189cfa2b1019a6271aaa39467b59e259706564b642ff3838d50" +// } +//} +// +// result = { +// currentVersion:{ +// reference:"88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854", +// accessDate:"Wed, 13 February 2008 14:25:12 UTC", +// creationDate:"Tue, 17 April 2007 17:17:52 UTC", +// version:"0.2", +// data:"xI3WXddQLFtL......EGyKnnAVik", +// updateDate:"Tue, 17 April 2007 17:17:52 UTC", +// header:"####" +// } +// reference:"13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551", +// oldestUsedEncryptedVersion:"0.2", +// accessDate:"Wed, 13 February 2008 14:25:12 UTC", +// creationDate:"Wed, 14 March 2007 13:53:11 UTC", +// version:"0.2", +// updatedDate:"Tue, 17 April 2007 17:17:52 UTC", +// data:"0/BjzyY6jeh71h...pAw2++NEyylGhMC5C5f5m8pBApYziN84s4O3JQ3khW/1UttQl4=" +// } + $record = new record(); + + $recordList = $record->GetList(array(array("reference", "=", $parameters["parameters"]["reference"]))); + $currentRecord = $recordList[0]; + $currentRecordVersions = $currentRecord->GetRecordversionList(); + $currentVersion = $currentRecordVersions[0]; + + $result["currentVersion"] = array(); + $result["currentVersion"]["reference"] = $currentVersion->reference; + $result["currentVersion"]["data"] = $currentVersion->data; + $result["currentVersion"]["header"] = $currentVersion->header; + $result["currentVersion"]["version"] = $currentVersion->version; + $result["currentVersion"]["creationDate"] = $currentVersion->creation_date; + $result["currentVersion"]["updateDate"] = $currentVersion->update_date; + $result["currentVersion"]["accessDate"] = $currentVersion->access_date; + + $result["reference"] = $currentRecord->reference; + $result["data"] = $currentRecord->data; + $result["version"] = $currentRecord->version; + $result["creationDate"] = $currentRecord->creation_date; + $result["updateDate"] = $currentRecord->update_date; + $result["accessDate"] = $currentRecord->access_date; + $result["oldestUsedEncryptedVersion"] = "---"; + + //============================================================= + } else if ($message == "updateData") { +//{ +// "message":"updateData", +// "srpSharedSecret":"4e4aadb1d64513ec4dd42f5e8d5b2d4363de75e4424b6bcf178c9d6a246356c5", +// "parameters":{ +// "records":[ +// { +// "record":{ +// "reference":"740009737139a189cfa2b1019a6271aaa39467b59e259706564b642ff3838d50", +// "data":"8hgR0Z+JDrUa812polDJ....JnZUKXNEqKI", +// "version":"0.3" +// }, +// "currentRecordVersion":{ +// "reference":"b1d82aeb9a0c4f6584bea68ba80839f43dd6ede79791549e29a1860554b144ee", +// "recordReference":"740009737139a189cfa2b1019a6271aaa39467b59e259706564b642ff3838d50", +// "data":"2d/UgKxxV+kBPV9GRUE.....VGonDoW0tqefxOJo=", +// "version":"0.3", +// "previousVersion":"55904195249037394316d3be3f5e78f08073170103bf0e7ab49a911c159cb0be", +// "previousVersionKey":"YWiaZeMIVHaIl96OWW+2e8....6d6nHbn6cr2NA/dbQRuC2w==" +// } +// } +// ], +// "user":{ +// "header":"{\"rec.....sion\":\"0.1\"}", +// "statistics":"tt3uU9hWBy8rNnMckgCnxMJh", +// "version":"0.3", +// "lock":"----" +// } +// } +//} + + $user = new user(); + $user = $user->Get($_SESSION["userId"]); + updateUserData($parameters["parameters"]["user"], $user); + $user->Save(); + + $recordParameterList = $parameters["parameters"]["records"]; + $c = count($recordParameterList); + for ($i=0; $i<$c; $i++) { + $recordList = $user->GetRecordList(array(array("reference", "=", $recordParameterList[$i]["record"]["reference"]))); + $currentRecord = $recordList[0]; + $currentRecordVersions = $currentRecord->GetRecordversionList(); + $currentVersion = $currentRecordVersions[0]; + + updateRecordData($recordParameterList[$i], $currentRecord, $currentVersion); + + + $currentRecord->Save(); + $currentVersion->Save(); + } + + + $result["lock"] = $user->lock; + $result["result"] = "done"; + + //============================================================= + } else if ($message == "deleteRecords") { +//{ +// "message":"deleteRecords", +// "srpSharedSecret":"4a64982f7ee366954ec50b9efea62a902a097ef111410c2aa7c4d5343bd1cdd1", +// "parameters":{ +// "recordReferences":["46494c81d10b80ab190d41e6806ef63869cfcc7a0ab8fe98cc3f93de4729bb9a"], +// "user":{ +// "header":"{\"rec...rsion\":\"0.1\"}", +// "statistics":"44kOOda0xYZjbcugJBdagBQx", +// "version":"0.3", +// "lock":"----" +// } +// } +//} + $user = new user(); + $user = $user->Get($_SESSION["userId"]); + + $recordReferenceList = $parameters["parameters"]["recordReferences"]; + $recordList = array(); + $c = count($recordReferenceList); + for ($i=0; $i<$c; $i++) { + array_push($recordList, array("reference", "=", $recordReferenceList[$i])); + } + + $record = new record(); + $record->DeleteList($recordList, true); + + updateUserData($parameters["parameters"]["user"], $user); + $user->Save(); + + $result["recordList"] = $recordList; + $result["lock"] = $user->lock; + $result["result"] = "done"; + + //============================================================= + } else if ($message == "deleteUser") { +//{"message":"deleteUser", "srpSharedSecret":"e8e4ca6544dca49c95b3647d8358ad54c317048b74d2ac187ac25f719c9bac58", "parameters":{}} + $user = new user(); + $user->Get($_SESSION["userId"]); + $user->Delete(true); + + $result["result"] = "ok"; + + //============================================================= + } else if ($message == "addNewOneTimePassword") { +//{ +// "message":"addNewOneTimePassword", +// "srpSharedSecret":"96fee4af06c09ce954fe7a9f87970e943449186bebf70bac0af1d6ebb818dabb", +// "parameters":{ +// "user":{ +// "header":"{\"records\":{\"index\":{\"419ea6....rsion\":\"0.1\"}", +// "statistics":"rrlwNbDt83rpWT4S72upiVsC", +// "version":"0.3", +// "lock":"----" +// }, +// "oneTimePassword":{ +// "reference":"29e26f3a2aae61fe5cf58c45296c6df4f3dceafe067ea550b455be345f44123c", +// "key":"afb848208758361a96a298b9db08995cf036011747809357a90645bc93fdfa03", +// "keyChecksum":"d1599ae443b5a566bfd93c0aeec4c81b42c0506ee09874dae050449580bb3486", +// "data":"hsyY8DHksgR52x6c4j7XAtIUeY.....dxsr3XWt7CbGg==", +// "version":"0.3" +// } +// } +//} + + fixOTPStatusTable(); + + $user = new user(); + $user = $user->Get($_SESSION["userId"]); + + $otp = new onetimepassword(); + updateOTP($parameters["parameters"]["oneTimePassword"], $otp, "ACTIVE"); + $user->AddOnetimepassword($otp); + + updateUserData($parameters["parameters"]["user"], $user); + $user->Save(); + + $result["lock"] = $user->lock; + $result["result"] = "done"; + + //============================================================= + } else if ($message == "updateOneTimePasswords") { +//{ +// "message":"updateOneTimePasswords", +// "srpSharedSecret":"c78f8ed099ea421f4dd0a4e02dbaf1f7da925f0088188d99399874ff064a3d27", +// "parameters":{ +// "user":{ +// "header":"{\"reco...sion\":\"0.1\"}", +// "statistics":"UeRq75RZHzDC7elzrh/+OB5d", +// "version":"0.3", +// "lock":"----" +// }, +// "oneTimePasswords":["f5f44c232f239efe48ab81a6236deea1a840d52946f7d4d782dad52b4c5359ce"] +// } +//} + + $user = new user(); + $user = $user->Get($_SESSION["userId"]); + + $validOtpReferences = $parameters["parameters"]["oneTimePasswords"]; + + $otpList = $user->GetOnetimepasswordList(); + $c = count($otpList); + for ($i=0; $i<$c; $i++) { + $currentOtp = $otpList[$i]; + if (arrayContainsValue($validOtpReferences, $currentOtp->reference) == false) { + $currentOtp->Delete(); + } + } + + updateUserData($parameters["parameters"]["user"], $user); + $user->Save(); + + $result["result"] = $user->lock; + + //============================================================= + } else if ($message == "getOneTimePasswordsDetails") { + + //============================================================= + } else if ($message == "getLoginHistory") { + $result["result"] = array(); + + //============================================================= + } else if ($message == "upgradeUserCredentials") { +//{ +// "message":"upgradeUserCredentials", +// "srpSharedSecret":"f1c25322e1478c8fb26063e9eef2f6fc25e0460065a31cb718f80bcff8f8a735", +// "parameters":{ +// "user":{ +// "header":"{\"reco...sion\":\"0.1\"}", +// "statistics":"s72Xva+w7CLgH+ihwqwXUbyu", +// "version":"0.3", +// "lock":"----" +// }, +// "credentials":{ +// "C":"57d15a8afbc1ae08103bd991d387ddfd8d26824276476fe709d754f098b6c26d", +// "s":"d6735fc0486f391c4f3c947928f9e61a2418e7bed2bc9b25bb43f93acc52f636", +// "v":"540c2ebbf941a481b6b2c9026c07fb46e8202e4408ed96864a696deb622baece", +// "version":"0.2" +// }, +// "oneTimePasswords":{ +// "923cdc61c4b877b263236124c44d69b459d240453a461cce8ddf7518b423ca94": "1HD6Ta0xsifEDhDwE....9WDK6tvrS6w==", +// "fb1573cb9497652a81688a099a524fb116e604c6fbc191cf33406eb8438efa5f": "CocN0cSxLmMRdgNF9....o3xhGUEY68Q==" +// } +// } +//} + + $user = new user(); + $user->Get($_SESSION["userId"]); + + $otp = new onetimepassword(); + + updateUserCredentials($parameters["parameters"]["credentials"], $user); + updateUserData($parameters["parameters"]["user"], $user); + + $otpList = $parameters["parameters"]["oneTimePasswords"]; + foreach($otpList as $otpReference=>$otpData) { + $otpList = $otp->GetList(array(array("reference", "=", $otpReference))); + $currentOtp = $otpList[0]; + $currentOtp->data = $otpData; + $currentOtp->Save(); + } + + $user->Save(); + + $result["lock"] = $user->lock; + $result["result"] = "done"; + + //============================================================= + } else if ($message == "echo") { + $result["result"] = $parameters; + } + + //============================================================= + } else { + $result["error"] = "Wrong shared secret!"; + } + break; + + case "logout": +error_log("logout"); + session_destroy(); + break; + + default: +error_log("default"); + $result["result"] = $parameters; + break; + } + + session_write_close(); + + echo(json_encode($result)); +error_log("result: ".json_encode($result)); +?> \ No newline at end of file diff --git a/backend/php/src/json/JSON.php b/backend/php/src/json/JSON.php new file mode 100644 index 0000000..0cddbdd --- /dev/null +++ b/backend/php/src/json/JSON.php @@ -0,0 +1,806 @@ + + * @author Matt Knapp + * @author Brett Stimmerman + * @copyright 2005 Michal Migurski + * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ + * @license http://www.opensource.org/licenses/bsd-license.php + * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 + */ + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_SLICE', 1); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_STR', 2); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_ARR', 3); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_OBJ', 4); + +/** + * Marker constant for Services_JSON::decode(), used to flag stack state + */ +define('SERVICES_JSON_IN_CMT', 5); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_LOOSE_TYPE', 16); + +/** + * Behavior switch for Services_JSON::decode() + */ +define('SERVICES_JSON_SUPPRESS_ERRORS', 32); + +/** + * Converts to and from JSON format. + * + * Brief example of use: + * + * + * // create a new instance of Services_JSON + * $json = new Services_JSON(); + * + * // convert a complexe value to JSON notation, and send it to the browser + * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); + * $output = $json->encode($value); + * + * print($output); + * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] + * + * // accept incoming POST data, assumed to be in JSON notation + * $input = file_get_contents('php://input', 1000000); + * $value = $json->decode($input); + * + */ +class Services_JSON +{ + /** + * constructs a new JSON instance + * + * @param int $use object behavior flags; combine with boolean-OR + * + * possible values: + * - SERVICES_JSON_LOOSE_TYPE: loose typing. + * "{...}" syntax creates associative arrays + * instead of objects in decode(). + * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. + * Values which can't be encoded (e.g. resources) + * appear as NULL instead of throwing errors. + * By default, a deeply-nested resource will + * bubble up with an error, so all return values + * from encode() should be checked with isError() + */ + function Services_JSON($use = 0) + { + $this->use = $use; + } + + /** + * convert a string from one UTF-16 char to one UTF-8 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf16 UTF-16 character + * @return string UTF-8 character + * @access private + */ + function utf162utf8($utf16) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); + } + + $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); + + switch(true) { + case ((0x7F & $bytes) == $bytes): + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x7F & $bytes); + + case (0x07FF & $bytes) == $bytes: + // return a 2-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xC0 | (($bytes >> 6) & 0x1F)) + . chr(0x80 | ($bytes & 0x3F)); + + case (0xFFFF & $bytes) == $bytes: + // return a 3-byte UTF-8 character + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0xE0 | (($bytes >> 12) & 0x0F)) + . chr(0x80 | (($bytes >> 6) & 0x3F)) + . chr(0x80 | ($bytes & 0x3F)); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * convert a string from one UTF-8 char to one UTF-16 char + * + * Normally should be handled by mb_convert_encoding, but + * provides a slower PHP-only method for installations + * that lack the multibye string extension. + * + * @param string $utf8 UTF-8 character + * @return string UTF-16 character + * @access private + */ + function utf82utf16($utf8) + { + // oh please oh please oh please oh please oh please + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); + } + + switch(strlen($utf8)) { + case 1: + // this case should never be reached, because we are in ASCII range + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return $utf8; + + case 2: + // return a UTF-16 character from a 2-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr(0x07 & (ord($utf8{0}) >> 2)) + . chr((0xC0 & (ord($utf8{0}) << 6)) + | (0x3F & ord($utf8{1}))); + + case 3: + // return a UTF-16 character from a 3-byte UTF-8 char + // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + return chr((0xF0 & (ord($utf8{0}) << 4)) + | (0x0F & (ord($utf8{1}) >> 2))) + . chr((0xC0 & (ord($utf8{1}) << 6)) + | (0x7F & ord($utf8{2}))); + } + + // ignoring UTF-32 for now, sorry + return ''; + } + + /** + * encodes an arbitrary variable into JSON format + * + * @param mixed $var any number, boolean, string, array, or object to be encoded. + * see argument 1 to Services_JSON() above for array-parsing behavior. + * if var is a strng, note that encode() always expects it + * to be in ASCII or UTF-8 format! + * + * @return mixed JSON string representation of input var or an error if a problem occurs + * @access public + */ + function encode($var) + { + switch (gettype($var)) { + case 'boolean': + return $var ? 'true' : 'false'; + + case 'NULL': + return 'null'; + + case 'integer': + return (int) $var; + + case 'double': + case 'float': + return (float) $var; + + case 'string': + // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT + $ascii = ''; + $strlen_var = strlen($var); + + /* + * Iterate over every character in the string, + * escaping with a slash or encoding to UTF-8 where necessary + */ + for ($c = 0; $c < $strlen_var; ++$c) { + + $ord_var_c = ord($var{$c}); + + switch (true) { + case $ord_var_c == 0x08: + $ascii .= '\b'; + break; + case $ord_var_c == 0x09: + $ascii .= '\t'; + break; + case $ord_var_c == 0x0A: + $ascii .= '\n'; + break; + case $ord_var_c == 0x0C: + $ascii .= '\f'; + break; + case $ord_var_c == 0x0D: + $ascii .= '\r'; + break; + + case $ord_var_c == 0x22: + case $ord_var_c == 0x2F: + case $ord_var_c == 0x5C: + // double quote, slash, slosh + $ascii .= '\\'.$var{$c}; + break; + + case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): + // characters U-00000000 - U-0000007F (same as ASCII) + $ascii .= $var{$c}; + break; + + case (($ord_var_c & 0xE0) == 0xC0): + // characters U-00000080 - U-000007FF, mask 110XXXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, ord($var{$c + 1})); + $c += 1; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF0) == 0xE0): + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2})); + $c += 2; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xF8) == 0xF0): + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3})); + $c += 3; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFC) == 0xF8): + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4})); + $c += 4; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + + case (($ord_var_c & 0xFE) == 0xFC): + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $char = pack('C*', $ord_var_c, + ord($var{$c + 1}), + ord($var{$c + 2}), + ord($var{$c + 3}), + ord($var{$c + 4}), + ord($var{$c + 5})); + $c += 5; + $utf16 = $this->utf82utf16($char); + $ascii .= sprintf('\u%04s', bin2hex($utf16)); + break; + } + } + + return '"'.$ascii.'"'; + + case 'array': + /* + * As per JSON spec if any array key is not an integer + * we must treat the the whole array as an object. We + * also try to catch a sparsely populated associative + * array with numeric keys here because some JS engines + * will create an array with empty indexes up to + * max_index which can cause memory issues and because + * the keys, which may be relevant, will be remapped + * otherwise. + * + * As per the ECMA and JSON specification an object may + * have any string as a property. Unfortunately due to + * a hole in the ECMA specification if the key is a + * ECMA reserved word or starts with a digit the + * parameter is only accessible using ECMAScript's + * bracket notation. + */ + + // treat as a JSON object + if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { + $properties = array_map(array($this, 'name_value'), + array_keys($var), + array_values($var)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + } + + // treat it like a regular array + $elements = array_map(array($this, 'encode'), $var); + + foreach($elements as $element) { + if(Services_JSON::isError($element)) { + return $element; + } + } + + return '[' . join(',', $elements) . ']'; + + case 'object': + $vars = get_object_vars($var); + + $properties = array_map(array($this, 'name_value'), + array_keys($vars), + array_values($vars)); + + foreach($properties as $property) { + if(Services_JSON::isError($property)) { + return $property; + } + } + + return '{' . join(',', $properties) . '}'; + + default: + return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) + ? 'null' + : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); + } + } + + /** + * array-walking function for use in generating JSON-formatted name-value pairs + * + * @param string $name name of key to use + * @param mixed $value reference to an array element to be encoded + * + * @return string JSON-formatted name-value pair, like '"name":value' + * @access private + */ + function name_value($name, $value) + { + $encoded_value = $this->encode($value); + + if(Services_JSON::isError($encoded_value)) { + return $encoded_value; + } + + return $this->encode(strval($name)) . ':' . $encoded_value; + } + + /** + * reduce a string by removing leading and trailing comments and whitespace + * + * @param $str string string value to strip of comments and whitespace + * + * @return string string value stripped of comments and whitespace + * @access private + */ + function reduce_string($str) + { + $str = preg_replace(array( + + // eliminate single line comments in '// ...' form + '#^\s*//(.+)$#m', + + // eliminate multi-line comments in '/* ... */' form, at start of string + '#^\s*/\*(.+)\*/#Us', + + // eliminate multi-line comments in '/* ... */' form, at end of string + '#/\*(.+)\*/\s*$#Us' + + ), '', $str); + + // eliminate extraneous space + return trim($str); + } + + /** + * decodes a JSON string into appropriate variable + * + * @param string $str JSON-formatted string + * + * @return mixed number, boolean, string, array, or object + * corresponding to given JSON input string. + * See argument 1 to Services_JSON() above for object-output behavior. + * Note that decode() always returns strings + * in ASCII or UTF-8 format! + * @access public + */ + function decode($str) + { + $str = $this->reduce_string($str); + + switch (strtolower($str)) { + case 'true': + return true; + + case 'false': + return false; + + case 'null': + return null; + + default: + $m = array(); + + if (is_numeric($str)) { + // Lookie-loo, it's a number + + // This would work on its own, but I'm trying to be + // good about returning integers where appropriate: + // return (float)$str; + + // Return float or int, as appropriate + return ((float)$str == (integer)$str) + ? (integer)$str + : (float)$str; + + } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { + // STRINGS RETURNED IN UTF-8 FORMAT + $delim = substr($str, 0, 1); + $chrs = substr($str, 1, -1); + $utf8 = ''; + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c < $strlen_chrs; ++$c) { + + $substr_chrs_c_2 = substr($chrs, $c, 2); + $ord_chrs_c = ord($chrs{$c}); + + switch (true) { + case $substr_chrs_c_2 == '\b': + $utf8 .= chr(0x08); + ++$c; + break; + case $substr_chrs_c_2 == '\t': + $utf8 .= chr(0x09); + ++$c; + break; + case $substr_chrs_c_2 == '\n': + $utf8 .= chr(0x0A); + ++$c; + break; + case $substr_chrs_c_2 == '\f': + $utf8 .= chr(0x0C); + ++$c; + break; + case $substr_chrs_c_2 == '\r': + $utf8 .= chr(0x0D); + ++$c; + break; + + case $substr_chrs_c_2 == '\\"': + case $substr_chrs_c_2 == '\\\'': + case $substr_chrs_c_2 == '\\\\': + case $substr_chrs_c_2 == '\\/': + if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || + ($delim == "'" && $substr_chrs_c_2 != '\\"')) { + $utf8 .= $chrs{++$c}; + } + break; + + case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)): + // single, escaped unicode character + $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2))) + . chr(hexdec(substr($chrs, ($c + 4), 2))); + $utf8 .= $this->utf162utf8($utf16); + $c += 5; + break; + + case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): + $utf8 .= $chrs{$c}; + break; + + case ($ord_chrs_c & 0xE0) == 0xC0: + // characters U-00000080 - U-000007FF, mask 110XXXXX + //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 2); + ++$c; + break; + + case ($ord_chrs_c & 0xF0) == 0xE0: + // characters U-00000800 - U-0000FFFF, mask 1110XXXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 3); + $c += 2; + break; + + case ($ord_chrs_c & 0xF8) == 0xF0: + // characters U-00010000 - U-001FFFFF, mask 11110XXX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 4); + $c += 3; + break; + + case ($ord_chrs_c & 0xFC) == 0xF8: + // characters U-00200000 - U-03FFFFFF, mask 111110XX + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 5); + $c += 4; + break; + + case ($ord_chrs_c & 0xFE) == 0xFC: + // characters U-04000000 - U-7FFFFFFF, mask 1111110X + // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + $utf8 .= substr($chrs, $c, 6); + $c += 5; + break; + + } + + } + + return $utf8; + + } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { + // array, or object notation + + if ($str{0} == '[') { + $stk = array(SERVICES_JSON_IN_ARR); + $arr = array(); + } else { + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = array(); + } else { + $stk = array(SERVICES_JSON_IN_OBJ); + $obj = new stdClass(); + } + } + + array_push($stk, array('what' => SERVICES_JSON_SLICE, + 'where' => 0, + 'delim' => false)); + + $chrs = substr($str, 1, -1); + $chrs = $this->reduce_string($chrs); + + if ($chrs == '') { + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } else { + return $obj; + + } + } + + //print("\nparsing {$chrs}\n"); + + $strlen_chrs = strlen($chrs); + + for ($c = 0; $c <= $strlen_chrs; ++$c) { + + $top = end($stk); + $substr_chrs_c_2 = substr($chrs, $c, 2); + + if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { + // found a comma that is not inside a string, array, etc., + // OR we've reached the end of the character list + $slice = substr($chrs, $top['where'], ($c - $top['where'])); + array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); + //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + // we are in an array, so just push an element onto the stack + array_push($arr, $this->decode($slice)); + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + // we are in an object, so figure + // out the property name and set an + // element in an associative array, + // for now + $parts = array(); + + if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // "name":value pair + $key = $this->decode($parts[1]); + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) { + // name:value pair, where name is unquoted + $key = $parts[1]; + $val = $this->decode($parts[2]); + + if ($this->use & SERVICES_JSON_LOOSE_TYPE) { + $obj[$key] = $val; + } else { + $obj->$key = $val; + } + } + + } + + } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { + // found a quote, and we are not inside a string + array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); + //print("Found start of string at {$c}\n"); + + } elseif (($chrs{$c} == $top['delim']) && + ($top['what'] == SERVICES_JSON_IN_STR) && + ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) { + // found a quote, we're in a string, and it's not escaped + // we know that it's not escaped becase there is _not_ an + // odd number of backslashes at the end of the string so far + array_pop($stk); + //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '[') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-bracket, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); + //print("Found start of array at {$c}\n"); + + } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { + // found a right-bracket, and we're in an array + array_pop($stk); + //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($chrs{$c} == '{') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a left-brace, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); + //print("Found start of object at {$c}\n"); + + } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { + // found a right-brace, and we're in an object + array_pop($stk); + //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } elseif (($substr_chrs_c_2 == '/*') && + in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { + // found a comment start, and we are in an array, object, or slice + array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); + $c++; + //print("Found start of comment at {$c}\n"); + + } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { + // found a comment end, and we're in one now + array_pop($stk); + $c++; + + for ($i = $top['where']; $i <= $c; ++$i) + $chrs = substr_replace($chrs, ' ', $i, 1); + + //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n"); + + } + + } + + if (reset($stk) == SERVICES_JSON_IN_ARR) { + return $arr; + + } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { + return $obj; + + } + + } + } + } + + /** + * @todo Ultimately, this should just call PEAR::isError() + */ + function isError($data, $code = null) + { + if (class_exists('pear')) { + return PEAR::isError($data, $code); + } elseif (is_object($data) && (get_class($data) == 'services_json_error' || + is_subclass_of($data, 'services_json_error'))) { + return true; + } + + return false; + } +} + +if (class_exists('PEAR_Error')) { + + class Services_JSON_Error extends PEAR_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + parent::PEAR_Error($message, $code, $mode, $options, $userinfo); + } + } + +} else { + + /** + * @todo Ultimately, this class shall be descended from PEAR_Error + */ + class Services_JSON_Error + { + function Services_JSON_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + + } + } + +} + +?> diff --git a/backend/php/src/objects/class.database.php b/backend/php/src/objects/class.database.php new file mode 100644 index 0000000..e8a13f7 --- /dev/null +++ b/backend/php/src/objects/class.database.php @@ -0,0 +1,79 @@ +Database Connection class. +* @author Php Object Generator +* @version 3.0d / PHP5.1 +* @see http://www.phpobjectgenerator.com/ +* @copyright Free for personal & commercial use. (Offered under the BSD license) +*/ + Class Database +{ + public $connection; + + private function Database() + { + $databaseName = $GLOBALS['configuration']['db']; + $serverName = $GLOBALS['configuration']['host']; + $databaseUser = $GLOBALS['configuration']['user']; + $databasePassword = $GLOBALS['configuration']['pass']; + $databasePort = $GLOBALS['configuration']['port']; + $this->connection = mysql_connect ($serverName.":".$databasePort, $databaseUser, $databasePassword); + if ($this->connection) + { + if (!mysql_select_db ($databaseName)) + { + throw new Exception('I cannot find the specified database "'.$databaseName.'". Please edit configuration.php.'); + } + } + else + { + throw new Exception('I cannot connect to the database. Please edit configuration.php with your database configuration.'); + } + } + + public static function Connect() + { + static $database = null; + if (!isset($database)) + { + $database = new Database(); + } + return $database->connection; + } + + public static function Reader($query, $connection) + { + $cursor = mysql_query($query, $connection); + return $cursor; + } + + public static function Read($cursor) + { + return mysql_fetch_assoc($cursor); + } + + public static function NonQuery($query, $connection) + { + mysql_query($query, $connection); + $result = mysql_affected_rows($connection); + if ($result == -1) + { + return false; + } + return $result; + + } + + public static function Query($query, $connection) + { + $result = mysql_query($query, $connection); + return mysql_num_rows($result); + } + + public static function InsertOrUpdate($query, $connection) + { + $result = mysql_query($query, $connection); + return intval(mysql_insert_id($connection)); + } +} +?> diff --git a/backend/php/src/objects/class.onetimepassword.php b/backend/php/src/objects/class.onetimepassword.php new file mode 100644 index 0000000..90d5f1d --- /dev/null +++ b/backend/php/src/objects/class.onetimepassword.php @@ -0,0 +1,400 @@ +onetimepassword class with integrated CRUD methods. +* @author Php Object Generator +* @version POG 3.0d / PHP5.1 +* @copyright Free for personal & commercial use. (Offered under the BSD license) +* @link http://www.phpobjectgenerator.com/?language=php5.1&wrapper=pog&objectName=onetimepassword&attributeList=array+%28%0A++0+%3D%3E+%27user%27%2C%0A++1+%3D%3E+%27onetimepasswordstatus%27%2C%0A++2+%3D%3E+%27reference%27%2C%0A++3+%3D%3E+%27key%27%2C%0A++4+%3D%3E+%27key_checksum%27%2C%0A++5+%3D%3E+%27data%27%2C%0A++6+%3D%3E+%27version%27%2C%0A++7+%3D%3E+%27creation_date%27%2C%0A++8+%3D%3E+%27request_date%27%2C%0A++9+%3D%3E+%27usage_date%27%2C%0A%29&typeList=array+%28%0A++0+%3D%3E+%27BELONGSTO%27%2C%0A++1+%3D%3E+%27BELONGSTO%27%2C%0A++2+%3D%3E+%27VARCHAR%28255%29%27%2C%0A++3+%3D%3E+%27VARCHAR%28255%29%27%2C%0A++4+%3D%3E+%27VARCHAR%28255%29%27%2C%0A++5+%3D%3E+%27TEXT%27%2C%0A++6+%3D%3E+%27VARCHAR%28255%29%27%2C%0A++7+%3D%3E+%27TIMESTAMP%27%2C%0A++8+%3D%3E+%27TIMESTAMP%27%2C%0A++9+%3D%3E+%27TIMESTAMP%27%2C%0A%29 +*/ +include_once('class.pog_base.php'); +class onetimepassword extends POG_Base +{ + public $onetimepasswordId = ''; + + /** + * @var INT(11) + */ + public $userId; + + /** + * @var INT(11) + */ + public $onetimepasswordstatusId; + + /** + * @var VARCHAR(255) + */ + public $reference; + + /** + * @var VARCHAR(255) + */ + public $key; + + /** + * @var VARCHAR(255) + */ + public $key_checksum; + + /** + * @var TEXT + */ + public $data; + + /** + * @var VARCHAR(255) + */ + public $version; + + /** + * @var TIMESTAMP + */ + public $creation_date; + + /** + * @var TIMESTAMP + */ + public $request_date; + + /** + * @var TIMESTAMP + */ + public $usage_date; + + public $pog_attribute_type = array( + "onetimepasswordId" => array('db_attributes' => array("NUMERIC", "INT")), + "user" => array('db_attributes' => array("OBJECT", "BELONGSTO")), + "onetimepasswordstatus" => array('db_attributes' => array("OBJECT", "BELONGSTO")), + "reference" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "key" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "key_checksum" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "data" => array('db_attributes' => array("TEXT", "TEXT")), + "version" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "creation_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + "request_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + "usage_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + ); + public $pog_query; + + + /** + * Getter for some private attributes + * @return mixed $attribute + */ + public function __get($attribute) + { + if (isset($this->{"_".$attribute})) + { + return $this->{"_".$attribute}; + } + else + { + return false; + } + } + + function onetimepassword($reference='', $key='', $key_checksum='', $data='', $version='', $creation_date='', $request_date='', $usage_date='') + { + $this->reference = $reference; + $this->key = $key; + $this->key_checksum = $key_checksum; + $this->data = $data; + $this->version = $version; + $this->creation_date = $creation_date; + $this->request_date = $request_date; + $this->usage_date = $usage_date; + } + + + /** + * Gets object from database + * @param integer $onetimepasswordId + * @return object $onetimepassword + */ + function Get($onetimepasswordId) + { + $connection = Database::Connect(); + $this->pog_query = "select * from `onetimepassword` where `onetimepasswordid`='".intval($onetimepasswordId)."' LIMIT 1"; + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $this->onetimepasswordId = $row['onetimepasswordid']; + $this->userId = $row['userid']; + $this->onetimepasswordstatusId = $row['onetimepasswordstatusid']; + $this->reference = $this->Unescape($row['reference']); + $this->key = $this->Unescape($row['key']); + $this->key_checksum = $this->Unescape($row['key_checksum']); + $this->data = $this->Unescape($row['data']); + $this->version = $this->Unescape($row['version']); + $this->creation_date = $row['creation_date']; + $this->request_date = $row['request_date']; + $this->usage_date = $row['usage_date']; + } + return $this; + } + + + /** + * Returns a sorted array of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array $onetimepasswordList + */ + function GetList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $connection = Database::Connect(); + $sqlLimit = ($limit != '' ? "LIMIT $limit" : ''); + $this->pog_query = "select * from `onetimepassword` "; + $onetimepasswordList = Array(); + if (sizeof($fcv_array) > 0) + { + $this->pog_query .= " where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $this->pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) != 1) + { + $this->pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? "BASE64_DECODE(".$fcv_array[$i][2].")" : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "BASE64_DECODE(`".$fcv_array[$i][0]."`) ".$fcv_array[$i][1]." ".$value; + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$this->Escape($fcv_array[$i][2])."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + } + } + if ($sortBy != '') + { + if (isset($this->pog_attribute_type[$sortBy]['db_attributes']) && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $sortBy = "BASE64_DECODE($sortBy) "; + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "onetimepasswordid"; + } + $this->pog_query .= " order by ".$sortBy." ".($ascending ? "asc" : "desc")." $sqlLimit"; + $thisObjectName = get_class($this); + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $onetimepassword = new $thisObjectName(); + $onetimepassword->onetimepasswordId = $row['onetimepasswordid']; + $onetimepassword->userId = $row['userid']; + $onetimepassword->onetimepasswordstatusId = $row['onetimepasswordstatusid']; + $onetimepassword->reference = $this->Unescape($row['reference']); + $onetimepassword->key = $this->Unescape($row['key']); + $onetimepassword->key_checksum = $this->Unescape($row['key_checksum']); + $onetimepassword->data = $this->Unescape($row['data']); + $onetimepassword->version = $this->Unescape($row['version']); + $onetimepassword->creation_date = $row['creation_date']; + $onetimepassword->request_date = $row['request_date']; + $onetimepassword->usage_date = $row['usage_date']; + $onetimepasswordList[] = $onetimepassword; + } + return $onetimepasswordList; + } + + + /** + * Saves the object to the database + * @return integer $onetimepasswordId + */ + function Save() + { + $connection = Database::Connect(); + $this->pog_query = "select `onetimepasswordid` from `onetimepassword` where `onetimepasswordid`='".$this->onetimepasswordId."' LIMIT 1"; + $rows = Database::Query($this->pog_query, $connection); + if ($rows > 0) + { + $this->pog_query = "update `onetimepassword` set + `userid`='".$this->userId."', + `onetimepasswordstatusid`='".$this->onetimepasswordstatusId."', + `reference`='".$this->Escape($this->reference)."', + `key`='".$this->Escape($this->key)."', + `key_checksum`='".$this->Escape($this->key_checksum)."', + `data`='".$this->Escape($this->data)."', + `version`='".$this->Escape($this->version)."', + `creation_date`='".$this->creation_date."', + `request_date`='".$this->request_date."', + `usage_date`='".$this->usage_date."' where `onetimepasswordid`='".$this->onetimepasswordId."'"; + } + else + { + $this->pog_query = "insert into `onetimepassword` (`userid`, `onetimepasswordstatusid`, `reference`, `key`, `key_checksum`, `data`, `version`, `creation_date`, `request_date`, `usage_date` ) values ( + '".$this->userId."', + '".$this->onetimepasswordstatusId."', + '".$this->Escape($this->reference)."', + '".$this->Escape($this->key)."', + '".$this->Escape($this->key_checksum)."', + '".$this->Escape($this->data)."', + '".$this->Escape($this->version)."', + '".$this->creation_date."', + '".$this->request_date."', + '".$this->usage_date."' )"; + } + $insertId = Database::InsertOrUpdate($this->pog_query, $connection); + if ($this->onetimepasswordId == "") + { + $this->onetimepasswordId = $insertId; + } + return $this->onetimepasswordId; + } + + + /** + * Clones the object and saves it to the database + * @return integer $onetimepasswordId + */ + function SaveNew() + { + $this->onetimepasswordId = ''; + return $this->Save(); + } + + + /** + * Deletes the object from the database + * @return boolean + */ + function Delete() + { + $connection = Database::Connect(); + $this->pog_query = "delete from `onetimepassword` where `onetimepasswordid`='".$this->onetimepasswordId."'"; + return Database::NonQuery($this->pog_query, $connection); + } + + + /** + * Deletes a list of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param bool $deep + * @return + */ + function DeleteList($fcv_array) + { + if (sizeof($fcv_array) > 0) + { + $connection = Database::Connect(); + $pog_query = "delete from `onetimepassword` where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) !== 1) + { + $pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$this->Escape($fcv_array[$i][2])."'"; + } + else + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$fcv_array[$i][2]."'"; + } + } + } + return Database::NonQuery($pog_query, $connection); + } + } + + + /** + * Associates the user object to this one + * @return boolean + */ + function GetUser() + { + $user = new user(); + return $user->Get($this->userId); + } + + + /** + * Associates the user object to this one + * @return + */ + function SetUser(&$user) + { + $this->userId = $user->userId; + } + + + /** + * Associates the onetimepasswordstatus object to this one + * @return boolean + */ + function GetOnetimepasswordstatus() + { + $onetimepasswordstatus = new onetimepasswordstatus(); + return $onetimepasswordstatus->Get($this->onetimepasswordstatusId); + } + + + /** + * Associates the onetimepasswordstatus object to this one + * @return + */ + function SetOnetimepasswordstatus(&$onetimepasswordstatus) + { + $this->onetimepasswordstatusId = $onetimepasswordstatus->onetimepasswordstatusId; + } +} +?> \ No newline at end of file diff --git a/backend/php/src/objects/class.onetimepasswordstatus.php b/backend/php/src/objects/class.onetimepasswordstatus.php new file mode 100644 index 0000000..f0ef08a --- /dev/null +++ b/backend/php/src/objects/class.onetimepasswordstatus.php @@ -0,0 +1,368 @@ +onetimepasswordstatus class with integrated CRUD methods. +* @author Php Object Generator +* @version POG 3.0d / PHP5.1 MYSQL +* @see http://www.phpobjectgenerator.com/plog/tutorials/45/pdo-mysql +* @copyright Free for personal & commercial use. (Offered under the BSD license) +* @link http://www.phpobjectgenerator.com/?language=php5.1&wrapper=pdo&pdoDriver=mysql&objectName=onetimepasswordstatus&attributeList=array+%28%0A++0+%3D%3E+%27onetimepassword%27%2C%0A++1+%3D%3E+%27code%27%2C%0A++2+%3D%3E+%27name%27%2C%0A++3+%3D%3E+%27description%27%2C%0A%29&typeList=array%2B%2528%250A%2B%2B0%2B%253D%253E%2B%2527HASMANY%2527%252C%250A%2B%2B1%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B2%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B3%2B%253D%253E%2B%2527TEXT%2527%252C%250A%2529 +*/ +include_once('class.pog_base.php'); +class onetimepasswordstatus extends POG_Base +{ + public $onetimepasswordstatusId = ''; + + /** + * @var private array of onetimepassword objects + */ + private $_onetimepasswordList = array(); + + /** + * @var VARCHAR(255) + */ + public $code; + + /** + * @var VARCHAR(255) + */ + public $name; + + /** + * @var TEXT + */ + public $description; + + public $pog_attribute_type = array( + "onetimepasswordstatusId" => array('db_attributes' => array("NUMERIC", "INT")), + "onetimepassword" => array('db_attributes' => array("OBJECT", "HASMANY")), + "code" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "name" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "description" => array('db_attributes' => array("TEXT", "TEXT")), + ); + public $pog_query; + + + /** + * Getter for some private attributes + * @return mixed $attribute + */ + public function __get($attribute) + { + if (isset($this->{"_".$attribute})) + { + return $this->{"_".$attribute}; + } + else + { + return false; + } + } + + function onetimepasswordstatus($code='', $name='', $description='') + { + $this->_onetimepasswordList = array(); + $this->code = $code; + $this->name = $name; + $this->description = $description; + } + + + /** + * Gets object from database + * @param integer $onetimepasswordstatusId + * @return object $onetimepasswordstatus + */ + function Get($onetimepasswordstatusId) + { + $connection = Database::Connect(); + $this->pog_query = "select * from `onetimepasswordstatus` where `onetimepasswordstatusid`='".intval($onetimepasswordstatusId)."' LIMIT 1"; + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $this->onetimepasswordstatusId = $row['onetimepasswordstatusid']; + $this->code = $this->Unescape($row['code']); + $this->name = $this->Unescape($row['name']); + $this->description = $this->Unescape($row['description']); + } + return $this; + } + + + /** + * Returns a sorted array of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array $onetimepasswordstatusList + */ + function GetList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $connection = Database::Connect(); + $sqlLimit = ($limit != '' ? "LIMIT $limit" : ''); + $this->pog_query = "select * from `onetimepasswordstatus` "; + $onetimepasswordstatusList = Array(); + if (sizeof($fcv_array) > 0) + { + $this->pog_query .= " where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $this->pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) != 1) + { + $this->pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? "BASE64_DECODE(".$fcv_array[$i][2].")" : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "BASE64_DECODE(`".$fcv_array[$i][0]."`) ".$fcv_array[$i][1]." ".$value; + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$this->Escape($fcv_array[$i][2])."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + } + } + if ($sortBy != '') + { + if (isset($this->pog_attribute_type[$sortBy]['db_attributes']) && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $sortBy = "BASE64_DECODE($sortBy) "; + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "onetimepasswordstatusid"; + } + $this->pog_query .= " order by ".$sortBy." ".($ascending ? "asc" : "desc")." $sqlLimit"; + $thisObjectName = get_class($this); + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $onetimepasswordstatus = new $thisObjectName(); + $onetimepasswordstatus->onetimepasswordstatusId = $row['onetimepasswordstatusid']; + $onetimepasswordstatus->code = $this->Unescape($row['code']); + $onetimepasswordstatus->name = $this->Unescape($row['name']); + $onetimepasswordstatus->description = $this->Unescape($row['description']); + $onetimepasswordstatusList[] = $onetimepasswordstatus; + } + return $onetimepasswordstatusList; + } + + + /** + * Saves the object to the database + * @return integer $onetimepasswordstatusId + */ + function Save($deep = true) + { + $connection = Database::Connect(); + $this->pog_query = "select `onetimepasswordstatusid` from `onetimepasswordstatus` where `onetimepasswordstatusid`='".$this->onetimepasswordstatusId."' LIMIT 1"; + $rows = Database::Query($this->pog_query, $connection); + if ($rows > 0) + { + $this->pog_query = "update `onetimepasswordstatus` set + `code`='".$this->Escape($this->code)."', + `name`='".$this->Escape($this->name)."', + `description`='".$this->Escape($this->description)."' where `onetimepasswordstatusid`='".$this->onetimepasswordstatusId."'"; + } + else + { + $this->pog_query = "insert into `onetimepasswordstatus` (`code`, `name`, `description` ) values ( + '".$this->Escape($this->code)."', + '".$this->Escape($this->name)."', + '".$this->Escape($this->description)."' )"; + } + $insertId = Database::InsertOrUpdate($this->pog_query, $connection); + if ($this->onetimepasswordstatusId == "") + { + $this->onetimepasswordstatusId = $insertId; + } + if ($deep) + { + foreach ($this->_onetimepasswordList as $onetimepassword) + { + $onetimepassword->onetimepasswordstatusId = $this->onetimepasswordstatusId; + $onetimepassword->Save($deep); + } + } + return $this->onetimepasswordstatusId; + } + + + /** + * Clones the object and saves it to the database + * @return integer $onetimepasswordstatusId + */ + function SaveNew($deep = false) + { + $this->onetimepasswordstatusId = ''; + return $this->Save($deep); + } + + + /** + * Deletes the object from the database + * @return boolean + */ + function Delete($deep = false, $across = false) + { + if ($deep) + { + $onetimepasswordList = $this->GetOnetimepasswordList(); + foreach ($onetimepasswordList as $onetimepassword) + { + $onetimepassword->Delete($deep, $across); + } + } + $connection = Database::Connect(); + $this->pog_query = "delete from `onetimepasswordstatus` where `onetimepasswordstatusid`='".$this->onetimepasswordstatusId."'"; + return Database::NonQuery($this->pog_query, $connection); + } + + + /** + * Deletes a list of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param bool $deep + * @return + */ + function DeleteList($fcv_array, $deep = false, $across = false) + { + if (sizeof($fcv_array) > 0) + { + if ($deep || $across) + { + $objectList = $this->GetList($fcv_array); + foreach ($objectList as $object) + { + $object->Delete($deep, $across); + } + } + else + { + $connection = Database::Connect(); + $pog_query = "delete from `onetimepasswordstatus` where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) !== 1) + { + $pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$this->Escape($fcv_array[$i][2])."'"; + } + else + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$fcv_array[$i][2]."'"; + } + } + } + return Database::NonQuery($pog_query, $connection); + } + } + } + + + /** + * Gets a list of onetimepassword objects associated to this one + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array of onetimepassword objects + */ + function GetOnetimepasswordList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $onetimepassword = new onetimepassword(); + $fcv_array[] = array("onetimepasswordstatusId", "=", $this->onetimepasswordstatusId); + $dbObjects = $onetimepassword->GetList($fcv_array, $sortBy, $ascending, $limit); + return $dbObjects; + } + + + /** + * Makes this the parent of all onetimepassword objects in the onetimepassword List array. Any existing onetimepassword will become orphan(s) + * @return null + */ + function SetOnetimepasswordList(&$list) + { + $this->_onetimepasswordList = array(); + $existingOnetimepasswordList = $this->GetOnetimepasswordList(); + foreach ($existingOnetimepasswordList as $onetimepassword) + { + $onetimepassword->onetimepasswordstatusId = ''; + $onetimepassword->Save(false); + } + $this->_onetimepasswordList = $list; + } + + + /** + * Associates the onetimepassword object to this one + * @return + */ + function AddOnetimepassword(&$onetimepassword) + { + $onetimepassword->onetimepasswordstatusId = $this->onetimepasswordstatusId; + $found = false; + foreach($this->_onetimepasswordList as $onetimepassword2) + { + if ($onetimepassword->onetimepasswordId > 0 && $onetimepassword->onetimepasswordId == $onetimepassword2->onetimepasswordId) + { + $found = true; + break; + } + } + if (!$found) + { + $this->_onetimepasswordList[] = $onetimepassword; + } + } +} +?> \ No newline at end of file diff --git a/backend/php/src/objects/class.pog_base.php b/backend/php/src/objects/class.pog_base.php new file mode 100644 index 0000000..6a8f570 --- /dev/null +++ b/backend/php/src/objects/class.pog_base.php @@ -0,0 +1,143 @@ +Execute(); + } + + /** + * constructor + * + * @return POG_Base + */ + private function POG_Base() + { + } + + + function SetFieldAttribute($fieldName, $attributeName, $attributeValue) + { + if (isset($this->pog_attribute_type[$fieldName]) && isset($this->pog_attribute_type[$fieldName][$attributeName])) + { + $this->pog_attribute_type[$fieldName][$attributeName] = $attributeValue; + } + } + + function GetFieldAttribute($fieldName, $attributeName) + { + if (isset($this->pog_attribute_type[$fieldName]) && isset($this->pog_attribute_type[$fieldName][$attributeName])) + { + return $this->pog_attribute_type[$fieldName][$attributeName]; + } + return null; + } + + /////////////////////////// + // Data manipulation + /////////////////////////// + + /** + * This function will try to encode $text to base64, except when $text is a number. This allows us to Escape all data before they're inserted in the database, regardless of attribute type. + * @param string $text + * @return string encoded to base64 + */ + public function Escape($text) + { + if ($GLOBALS['configuration']['db_encoding'] && !is_numeric($text)) + { + return base64_encode($text); + } + return addslashes($text); + } + + /** + * Enter description here... + * + * @param unknown_type $text + * @return unknown + */ + public function Unescape($text) + { + if ($GLOBALS['configuration']['db_encoding'] && !is_numeric($text)) + { + return base64_decode($text); + } + return stripcslashes($text); + } + + + //////////////////////////////// + // Table -> Object Mapping + //////////////////////////////// + + /** + * Executes $query against database and returns the result set as an array of POG objects + * + * @param string $query. SQL query to execute against database + * @param string $objectClass. POG Object type to return + * @param bool $lazy. If true, will also load all children/sibling + */ + public function FetchObjects($query, $objectClass, $lazy = true) + { + $databaseConnection = Database::Connect(); + $result = Database::Query($query, $databaseConnection); + $objectList = $this->CreateObjects($result, $objectClass, $lazy); + return $objectList; + } + + private function CreateObjects($mysql_result, $objectClass, $lazyLoad = true) + { + $objectList = array(); + while ($row = mysql_fetch_assoc($mysql_result)) + { + $pog_object = new $objectClass(); + $this->PopulateObjectAttributes($row, $pog_object); + $objectList[] = $pog_object; + } + return $objectList; + } + + private function PopulateObjectAttributes($fetched_row, $pog_object) + { + foreach ($this->GetAttributes($pog_object) as $column) + { + $pog_object->{$column} = $this->Unescape($fetched_row[strtolower($column)]); + } + return $pog_object; + } + + private function GetAttributes($object) + { + $columns = array(); + foreach ($object->pog_attribute_type as $att => $properties) + { + if ($properties['db_attributes'][0] != 'OBJECT') + { + $columns[] = $att; + } + } + return $columns; + } + + //misc + public static function IsColumn($value) + { + if (strlen($value) > 2) + { + if (substr($value, 0, 1) == '`' && substr($value, strlen($value) - 1, 1) == '`') + { + return true; + } + return false; + } + return false; + } +} +?> \ No newline at end of file diff --git a/backend/php/src/objects/class.record.php b/backend/php/src/objects/class.record.php new file mode 100644 index 0000000..a269e75 --- /dev/null +++ b/backend/php/src/objects/class.record.php @@ -0,0 +1,436 @@ +record class with integrated CRUD methods. +* @author Php Object Generator +* @version POG 3.0e / PHP5.1 MYSQL +* @see http://www.phpobjectgenerator.com/plog/tutorials/45/pdo-mysql +* @copyright Free for personal & commercial use. (Offered under the BSD license) +* @link http://www.phpobjectgenerator.com/?language=php5.1&wrapper=pdo&pdoDriver=mysql&objectName=record&attributeList=array+%28%0A++0+%3D%3E+%27user%27%2C%0A++1+%3D%3E+%27recordversion%27%2C%0A++2+%3D%3E+%27reference%27%2C%0A++3+%3D%3E+%27data%27%2C%0A++4+%3D%3E+%27version%27%2C%0A++5+%3D%3E+%27creation_date%27%2C%0A++6+%3D%3E+%27update_date%27%2C%0A++7+%3D%3E+%27access_date%27%2C%0A%29&typeList=array%2B%2528%250A%2B%2B0%2B%253D%253E%2B%2527BELONGSTO%2527%252C%250A%2B%2B1%2B%253D%253E%2B%2527HASMANY%2527%252C%250A%2B%2B2%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B3%2B%253D%253E%2B%2527LONGTEXT%2527%252C%250A%2B%2B4%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B5%2B%253D%253E%2B%2527TIMESTAMP%2527%252C%250A%2B%2B6%2B%253D%253E%2B%2527TIMESTAMP%2527%252C%250A%2B%2B7%2B%253D%253E%2B%2527TIMESTAMP%2527%252C%250A%2529 +*/ +include_once('class.pog_base.php'); +class record extends POG_Base +{ + public $recordId = ''; + + /** + * @var INT(11) + */ + public $userId; + + /** + * @var private array of recordversion objects + */ + private $_recordversionList = array(); + + /** + * @var VARCHAR(255) + */ + public $reference; + + /** + * @var LONGTEXT + */ + public $data; + + /** + * @var VARCHAR(255) + */ + public $version; + + /** + * @var TIMESTAMP + */ + public $creation_date; + + /** + * @var TIMESTAMP + */ + public $update_date; + + /** + * @var TIMESTAMP + */ + public $access_date; + + public $pog_attribute_type = array( + "recordId" => array('db_attributes' => array("NUMERIC", "INT")), + "user" => array('db_attributes' => array("OBJECT", "BELONGSTO")), + "recordversion" => array('db_attributes' => array("OBJECT", "HASMANY")), + "reference" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "data" => array('db_attributes' => array("TEXT", "LONGTEXT")), + "version" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "creation_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + "update_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + "access_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + ); + public $pog_query; + + + /** + * Getter for some private attributes + * @return mixed $attribute + */ + public function __get($attribute) + { + if (isset($this->{"_".$attribute})) + { + return $this->{"_".$attribute}; + } + else + { + return false; + } + } + + function record($reference='', $data='', $version='', $creation_date='', $update_date='', $access_date='') + { + $this->_recordversionList = array(); + $this->reference = $reference; + $this->data = $data; + $this->version = $version; + $this->creation_date = $creation_date; + $this->update_date = $update_date; + $this->access_date = $access_date; + } + + + /** + * Gets object from database + * @param integer $recordId + * @return object $record + */ + function Get($recordId) + { + $connection = Database::Connect(); + $this->pog_query = "select * from `record` where `recordid`='".intval($recordId)."' LIMIT 1"; + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $this->recordId = $row['recordid']; + $this->userId = $row['userid']; + $this->reference = $this->Unescape($row['reference']); + $this->data = $this->Unescape($row['data']); + $this->version = $this->Unescape($row['version']); + $this->creation_date = $row['creation_date']; + $this->update_date = $row['update_date']; + $this->access_date = $row['access_date']; + } + return $this; + } + + + /** + * Returns a sorted array of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array $recordList + */ + function GetList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $connection = Database::Connect(); + $sqlLimit = ($limit != '' ? "LIMIT $limit" : ''); + $this->pog_query = "select * from `record` "; + $recordList = Array(); + if (sizeof($fcv_array) > 0) + { + $this->pog_query .= " where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $this->pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) != 1) + { + $this->pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? "BASE64_DECODE(".$fcv_array[$i][2].")" : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "BASE64_DECODE(`".$fcv_array[$i][0]."`) ".$fcv_array[$i][1]." ".$value; + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$this->Escape($fcv_array[$i][2])."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + } + } + if ($sortBy != '') + { + if (isset($this->pog_attribute_type[$sortBy]['db_attributes']) && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $sortBy = "BASE64_DECODE($sortBy) "; + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "recordid"; + } + $this->pog_query .= " order by ".$sortBy." ".($ascending ? "asc" : "desc")." $sqlLimit"; + $thisObjectName = get_class($this); + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $record = new $thisObjectName(); + $record->recordId = $row['recordid']; + $record->userId = $row['userid']; + $record->reference = $this->Unescape($row['reference']); + $record->data = $this->Unescape($row['data']); + $record->version = $this->Unescape($row['version']); + $record->creation_date = $row['creation_date']; + $record->update_date = $row['update_date']; + $record->access_date = $row['access_date']; + $recordList[] = $record; + } + return $recordList; + } + + + /** + * Saves the object to the database + * @return integer $recordId + */ + function Save($deep = true) + { + $connection = Database::Connect(); + $this->pog_query = "select `recordid` from `record` where `recordid`='".$this->recordId."' LIMIT 1"; + $rows = Database::Query($this->pog_query, $connection); + if ($rows > 0) + { + $this->pog_query = "update `record` set + `userid`='".$this->userId."', + `reference`='".$this->Escape($this->reference)."', + `data`='".$this->Escape($this->data)."', + `version`='".$this->Escape($this->version)."', + `creation_date`='".$this->creation_date."', + `update_date`='".$this->update_date."', + `access_date`='".$this->access_date."' where `recordid`='".$this->recordId."'"; + } + else + { + $this->pog_query = "insert into `record` (`userid`, `reference`, `data`, `version`, `creation_date`, `update_date`, `access_date` ) values ( + '".$this->userId."', + '".$this->Escape($this->reference)."', + '".$this->Escape($this->data)."', + '".$this->Escape($this->version)."', + '".$this->creation_date."', + '".$this->update_date."', + '".$this->access_date."' )"; + } + $insertId = Database::InsertOrUpdate($this->pog_query, $connection); + if ($this->recordId == "") + { + $this->recordId = $insertId; + } + if ($deep) + { + foreach ($this->_recordversionList as $recordversion) + { + $recordversion->recordId = $this->recordId; + $recordversion->Save($deep); + } + } + return $this->recordId; + } + + + /** + * Clones the object and saves it to the database + * @return integer $recordId + */ + function SaveNew($deep = false) + { + $this->recordId = ''; + return $this->Save($deep); + } + + + /** + * Deletes the object from the database + * @return boolean + */ + function Delete($deep = false, $across = false) + { + if ($deep) + { + $recordversionList = $this->GetRecordversionList(); + foreach ($recordversionList as $recordversion) + { + $recordversion->Delete($deep, $across); + } + } + $connection = Database::Connect(); + $this->pog_query = "delete from `record` where `recordid`='".$this->recordId."'"; + return Database::NonQuery($this->pog_query, $connection); + } + + + /** + * Deletes a list of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param bool $deep + * @return + */ + function DeleteList($fcv_array, $deep = false, $across = false) + { + if (sizeof($fcv_array) > 0) + { + if ($deep || $across) + { + $objectList = $this->GetList($fcv_array); + foreach ($objectList as $object) + { + $object->Delete($deep, $across); + } + } + else + { + $connection = Database::Connect(); + $pog_query = "delete from `record` where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) !== 1) + { + $pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$this->Escape($fcv_array[$i][2])."'"; + } + else + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$fcv_array[$i][2]."'"; + } + } + } + return Database::NonQuery($pog_query, $connection); + } + } + } + + + /** + * Associates the user object to this one + * @return boolean + */ + function GetUser() + { + $user = new user(); + return $user->Get($this->userId); + } + + + /** + * Associates the user object to this one + * @return + */ + function SetUser(&$user) + { + $this->userId = $user->userId; + } + + + /** + * Gets a list of recordversion objects associated to this one + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array of recordversion objects + */ + function GetRecordversionList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $recordversion = new recordversion(); + $fcv_array[] = array("recordId", "=", $this->recordId); + $dbObjects = $recordversion->GetList($fcv_array, $sortBy, $ascending, $limit); + return $dbObjects; + } + + + /** + * Makes this the parent of all recordversion objects in the recordversion List array. Any existing recordversion will become orphan(s) + * @return null + */ + function SetRecordversionList(&$list) + { + $this->_recordversionList = array(); + $existingRecordversionList = $this->GetRecordversionList(); + foreach ($existingRecordversionList as $recordversion) + { + $recordversion->recordId = ''; + $recordversion->Save(false); + } + $this->_recordversionList = $list; + } + + + /** + * Associates the recordversion object to this one + * @return + */ + function AddRecordversion(&$recordversion) + { + $recordversion->recordId = $this->recordId; + $found = false; + foreach($this->_recordversionList as $recordversion2) + { + if ($recordversion->recordversionId > 0 && $recordversion->recordversionId == $recordversion2->recordversionId) + { + $found = true; + break; + } + } + if (!$found) + { + $this->_recordversionList[] = $recordversion; + } + } +} +?> \ No newline at end of file diff --git a/backend/php/src/objects/class.recordversion.php b/backend/php/src/objects/class.recordversion.php new file mode 100644 index 0000000..3fbc436 --- /dev/null +++ b/backend/php/src/objects/class.recordversion.php @@ -0,0 +1,381 @@ +recordversion class with integrated CRUD methods. +* @author Php Object Generator +* @version POG 3.0e / PHP5.1 MYSQL +* @see http://www.phpobjectgenerator.com/plog/tutorials/45/pdo-mysql +* @copyright Free for personal & commercial use. (Offered under the BSD license) +* @link http://www.phpobjectgenerator.com/?language=php5.1=pdo&pdoDriver=mysql&objectName=recordversion&attributeList=array+%28%0A++0+%3D%3E+%27record%27%2C%0A++1+%3D%3E+%27reference%27%2C%0A++2+%3D%3E+%27header%27%2C%0A++3+%3D%3E+%27data%27%2C%0A++4+%3D%3E+%27version%27%2C%0A++5+%3D%3E+%27previous_version_key%27%2C%0A++6+%3D%3E+%27previous_version_id%27%2C%0A++7+%3D%3E+%27creation_date%27%2C%0A++8+%3D%3E+%27update_date%27%2C%0A++9+%3D%3E+%27access_date%27%2C%0A%29&typeList=array%2B%2528%250A%2B%2B0%2B%253D%253E%2B%2527BELONGSTO%2527%252C%250A%2B%2B1%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B2%2B%253D%253E%2B%2527LONGTEXT%2527%252C%250A%2B%2B3%2B%253D%253E%2B%2527LONGTEXT%2527%252C%250A%2B%2B4%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B5%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B6%2B%253D%253E%2B%2527INT%2527%252C%250A%2B%2B7%2B%253D%253E%2B%2527TIMESTAMP%2527%252C%250A%2B%2B8%2B%253D%253E%2B%2527TIMESTAMP%2527%252C%250A%2B%2B9%2B%253D%253E%2B%2527TIMESTAMP%2527%252C%250A%2529 +*/ +include_once('class.pog_base.php'); +class recordversion extends POG_Base +{ + public $recordversionId = ''; + + /** + * @var INT(11) + */ + public $recordId; + + /** + * @var VARCHAR(255) + */ + public $reference; + + /** + * @var LONGTEXT + */ + public $header; + + /** + * @var LONGTEXT + */ + public $data; + + /** + * @var VARCHAR(255) + */ + public $version; + + /** + * @var VARCHAR(255) + */ + public $previous_version_key; + + /** + * @var INT + */ + public $previous_version_id; + + /** + * @var TIMESTAMP + */ + public $creation_date; + + /** + * @var TIMESTAMP + */ + public $update_date; + + /** + * @var TIMESTAMP + */ + public $access_date; + + public $pog_attribute_type = array( + "recordversionId" => array('db_attributes' => array("NUMERIC", "INT")), + "record" => array('db_attributes' => array("OBJECT", "BELONGSTO")), + "reference" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "header" => array('db_attributes' => array("TEXT", "LONGTEXT")), + "data" => array('db_attributes' => array("TEXT", "LONGTEXT")), + "version" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "previous_version_key" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "previous_version_id" => array('db_attributes' => array("NUMERIC", "INT")), + "creation_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + "update_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + "access_date" => array('db_attributes' => array("NUMERIC", "TIMESTAMP")), + ); + public $pog_query; + + + /** + * Getter for some private attributes + * @return mixed $attribute + */ + public function __get($attribute) + { + if (isset($this->{"_".$attribute})) + { + return $this->{"_".$attribute}; + } + else + { + return false; + } + } + + function recordversion($reference='', $header='', $data='', $version='', $previous_version_key='', $previous_version_id='', $creation_date='', $update_date='', $access_date='') + { + $this->reference = $reference; + $this->header = $header; + $this->data = $data; + $this->version = $version; + $this->previous_version_key = $previous_version_key; + $this->previous_version_id = $previous_version_id; + $this->creation_date = $creation_date; + $this->update_date = $update_date; + $this->access_date = $access_date; + } + + + /** + * Gets object from database + * @param integer $recordversionId + * @return object $recordversion + */ + function Get($recordversionId) + { + $connection = Database::Connect(); + $this->pog_query = "select * from `recordversion` where `recordversionid`='".intval($recordversionId)."' LIMIT 1"; + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $this->recordversionId = $row['recordversionid']; + $this->recordId = $row['recordid']; + $this->reference = $this->Unescape($row['reference']); + $this->header = $this->Unescape($row['header']); + $this->data = $this->Unescape($row['data']); + $this->version = $this->Unescape($row['version']); + $this->previous_version_key = $this->Unescape($row['previous_version_key']); + $this->previous_version_id = $this->Unescape($row['previous_version_id']); + $this->creation_date = $row['creation_date']; + $this->update_date = $row['update_date']; + $this->access_date = $row['access_date']; + } + return $this; + } + + + /** + * Returns a sorted array of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array $recordversionList + */ + function GetList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $connection = Database::Connect(); + $sqlLimit = ($limit != '' ? "LIMIT $limit" : ''); + $this->pog_query = "select * from `recordversion` "; + $recordversionList = Array(); + if (sizeof($fcv_array) > 0) + { + $this->pog_query .= " where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $this->pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) != 1) + { + $this->pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? "BASE64_DECODE(".$fcv_array[$i][2].")" : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "BASE64_DECODE(`".$fcv_array[$i][0]."`) ".$fcv_array[$i][1]." ".$value; + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$this->Escape($fcv_array[$i][2])."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + } + } + if ($sortBy != '') + { + if (isset($this->pog_attribute_type[$sortBy]['db_attributes']) && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $sortBy = "BASE64_DECODE($sortBy) "; + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "recordversionid"; + } + $this->pog_query .= " order by ".$sortBy." ".($ascending ? "asc" : "desc")." $sqlLimit"; + $thisObjectName = get_class($this); + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $recordversion = new $thisObjectName(); + $recordversion->recordversionId = $row['recordversionid']; + $recordversion->recordId = $row['recordid']; + $recordversion->reference = $this->Unescape($row['reference']); + $recordversion->header = $this->Unescape($row['header']); + $recordversion->data = $this->Unescape($row['data']); + $recordversion->version = $this->Unescape($row['version']); + $recordversion->previous_version_key = $this->Unescape($row['previous_version_key']); + $recordversion->previous_version_id = $this->Unescape($row['previous_version_id']); + $recordversion->creation_date = $row['creation_date']; + $recordversion->update_date = $row['update_date']; + $recordversion->access_date = $row['access_date']; + $recordversionList[] = $recordversion; + } + return $recordversionList; + } + + + /** + * Saves the object to the database + * @return integer $recordversionId + */ + function Save() + { + $connection = Database::Connect(); + $this->pog_query = "select `recordversionid` from `recordversion` where `recordversionid`='".$this->recordversionId."' LIMIT 1"; + $rows = Database::Query($this->pog_query, $connection); + if ($rows > 0) + { + $this->pog_query = "update `recordversion` set + `recordid`='".$this->recordId."', + `reference`='".$this->Escape($this->reference)."', + `header`='".$this->Escape($this->header)."', + `data`='".$this->Escape($this->data)."', + `version`='".$this->Escape($this->version)."', + `previous_version_key`='".$this->Escape($this->previous_version_key)."', + `previous_version_id`='".$this->Escape($this->previous_version_id)."', + `creation_date`='".$this->creation_date."', + `update_date`='".$this->update_date."', + `access_date`='".$this->access_date."' where `recordversionid`='".$this->recordversionId."'"; + } + else + { + $this->pog_query = "insert into `recordversion` (`recordid`, `reference`, `header`, `data`, `version`, `previous_version_key`, `previous_version_id`, `creation_date`, `update_date`, `access_date` ) values ( + '".$this->recordId."', + '".$this->Escape($this->reference)."', + '".$this->Escape($this->header)."', + '".$this->Escape($this->data)."', + '".$this->Escape($this->version)."', + '".$this->Escape($this->previous_version_key)."', + '".$this->Escape($this->previous_version_id)."', + '".$this->creation_date."', + '".$this->update_date."', + '".$this->access_date."' )"; + } + $insertId = Database::InsertOrUpdate($this->pog_query, $connection); + if ($this->recordversionId == "") + { + $this->recordversionId = $insertId; + } + return $this->recordversionId; + } + + + /** + * Clones the object and saves it to the database + * @return integer $recordversionId + */ + function SaveNew() + { + $this->recordversionId = ''; + return $this->Save(); + } + + + /** + * Deletes the object from the database + * @return boolean + */ + function Delete() + { + $connection = Database::Connect(); + $this->pog_query = "delete from `recordversion` where `recordversionid`='".$this->recordversionId."'"; + return Database::NonQuery($this->pog_query, $connection); + } + + + /** + * Deletes a list of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param bool $deep + * @return + */ + function DeleteList($fcv_array) + { + if (sizeof($fcv_array) > 0) + { + $connection = Database::Connect(); + $pog_query = "delete from `recordversion` where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) !== 1) + { + $pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$this->Escape($fcv_array[$i][2])."'"; + } + else + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$fcv_array[$i][2]."'"; + } + } + } + return Database::NonQuery($pog_query, $connection); + } + } + + + /** + * Associates the record object to this one + * @return boolean + */ + function GetRecord() + { + $record = new record(); + return $record->Get($this->recordId); + } + + + /** + * Associates the record object to this one + * @return + */ + function SetRecord(&$record) + { + $this->recordId = $record->recordId; + } +} +?> \ No newline at end of file diff --git a/backend/php/src/objects/class.user.php b/backend/php/src/objects/class.user.php new file mode 100644 index 0000000..f92c7ac --- /dev/null +++ b/backend/php/src/objects/class.user.php @@ -0,0 +1,502 @@ +user class with integrated CRUD methods. +* @author Php Object Generator +* @version POG 3.0e / PHP5.1 MYSQL +* @see http://www.phpobjectgenerator.com/plog/tutorials/45/pdo-mysql +* @copyright Free for personal & commercial use. (Offered under the BSD license) +* @link http://www.phpobjectgenerator.com/?language=php5.1&wrapper=pdo&pdoDriver=mysql&objectName=user&attributeList=array+%28%0A++0+%3D%3E+%27username%27%2C%0A++1+%3D%3E+%27srp_s%27%2C%0A++2+%3D%3E+%27srp_v%27%2C%0A++3+%3D%3E+%27header%27%2C%0A++4+%3D%3E+%27statistics%27%2C%0A++5+%3D%3E+%27auth_version%27%2C%0A++6+%3D%3E+%27version%27%2C%0A++7+%3D%3E+%27lock%27%2C%0A++8+%3D%3E+%27record%27%2C%0A++9+%3D%3E+%27onetimepassword%27%2C%0A%29&typeList=array%2B%2528%250A%2B%2B0%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B1%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B2%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B3%2B%253D%253E%2B%2527LONGTEXT%2527%252C%250A%2B%2B4%2B%253D%253E%2B%2527LONGTEXT%2527%252C%250A%2B%2B5%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B6%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B7%2B%253D%253E%2B%2527VARCHAR%2528255%2529%2527%252C%250A%2B%2B8%2B%253D%253E%2B%2527HASMANY%2527%252C%250A%2B%2B9%2B%253D%253E%2B%2527HASMANY%2527%252C%250A%2529 +*/ +include_once('class.pog_base.php'); +class user extends POG_Base +{ + public $userId = ''; + + /** + * @var VARCHAR(255) + */ + public $username; + + /** + * @var VARCHAR(255) + */ + public $srp_s; + + /** + * @var VARCHAR(255) + */ + public $srp_v; + + /** + * @var LONGTEXT + */ + public $header; + + /** + * @var LONGTEXT + */ + public $statistics; + + /** + * @var VARCHAR(255) + */ + public $auth_version; + + /** + * @var VARCHAR(255) + */ + public $version; + + /** + * @var VARCHAR(255) + */ + public $lock; + + /** + * @var private array of record objects + */ + private $_recordList = array(); + + /** + * @var private array of onetimepassword objects + */ + private $_onetimepasswordList = array(); + + public $pog_attribute_type = array( + "userId" => array('db_attributes' => array("NUMERIC", "INT")), + "username" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "srp_s" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "srp_v" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "header" => array('db_attributes' => array("TEXT", "LONGTEXT")), + "statistics" => array('db_attributes' => array("TEXT", "LONGTEXT")), + "auth_version" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "version" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "lock" => array('db_attributes' => array("TEXT", "VARCHAR", "255")), + "record" => array('db_attributes' => array("OBJECT", "HASMANY")), + "onetimepassword" => array('db_attributes' => array("OBJECT", "HASMANY")), + ); + public $pog_query; + + + /** + * Getter for some private attributes + * @return mixed $attribute + */ + public function __get($attribute) + { + if (isset($this->{"_".$attribute})) + { + return $this->{"_".$attribute}; + } + else + { + return false; + } + } + + function user($username='', $srp_s='', $srp_v='', $header='', $statistics='', $auth_version='', $version='', $lock='') + { + $this->username = $username; + $this->srp_s = $srp_s; + $this->srp_v = $srp_v; + $this->header = $header; + $this->statistics = $statistics; + $this->auth_version = $auth_version; + $this->version = $version; + $this->lock = $lock; + $this->_recordList = array(); + $this->_onetimepasswordList = array(); + } + + + /** + * Gets object from database + * @param integer $userId + * @return object $user + */ + function Get($userId) + { + $connection = Database::Connect(); + $this->pog_query = "select * from `user` where `userid`='".intval($userId)."' LIMIT 1"; + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $this->userId = $row['userid']; + $this->username = $this->Unescape($row['username']); + $this->srp_s = $this->Unescape($row['srp_s']); + $this->srp_v = $this->Unescape($row['srp_v']); + $this->header = $this->Unescape($row['header']); + $this->statistics = $this->Unescape($row['statistics']); + $this->auth_version = $this->Unescape($row['auth_version']); + $this->version = $this->Unescape($row['version']); + $this->lock = $this->Unescape($row['lock']); + } + return $this; + } + + + /** + * Returns a sorted array of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array $userList + */ + function GetList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $connection = Database::Connect(); + $sqlLimit = ($limit != '' ? "LIMIT $limit" : ''); + $this->pog_query = "select * from `user` "; + $userList = Array(); + if (sizeof($fcv_array) > 0) + { + $this->pog_query .= " where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $this->pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) != 1) + { + $this->pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? "BASE64_DECODE(".$fcv_array[$i][2].")" : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "BASE64_DECODE(`".$fcv_array[$i][0]."`) ".$fcv_array[$i][1]." ".$value; + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$this->Escape($fcv_array[$i][2])."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + else + { + $value = POG_Base::IsColumn($fcv_array[$i][2]) ? $fcv_array[$i][2] : "'".$fcv_array[$i][2]."'"; + $this->pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." ".$value; + } + } + } + } + if ($sortBy != '') + { + if (isset($this->pog_attribute_type[$sortBy]['db_attributes']) && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$sortBy]['db_attributes'][0] != 'SET') + { + if ($GLOBALS['configuration']['db_encoding'] == 1) + { + $sortBy = "BASE64_DECODE($sortBy) "; + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "$sortBy "; + } + } + else + { + $sortBy = "userid"; + } + $this->pog_query .= " order by ".$sortBy." ".($ascending ? "asc" : "desc")." $sqlLimit"; + $thisObjectName = get_class($this); + $cursor = Database::Reader($this->pog_query, $connection); + while ($row = Database::Read($cursor)) + { + $user = new $thisObjectName(); + $user->userId = $row['userid']; + $user->username = $this->Unescape($row['username']); + $user->srp_s = $this->Unescape($row['srp_s']); + $user->srp_v = $this->Unescape($row['srp_v']); + $user->header = $this->Unescape($row['header']); + $user->statistics = $this->Unescape($row['statistics']); + $user->auth_version = $this->Unescape($row['auth_version']); + $user->version = $this->Unescape($row['version']); + $user->lock = $this->Unescape($row['lock']); + $userList[] = $user; + } + return $userList; + } + + + /** + * Saves the object to the database + * @return integer $userId + */ + function Save($deep = true) + { + $connection = Database::Connect(); + $this->pog_query = "select `userid` from `user` where `userid`='".$this->userId."' LIMIT 1"; + $rows = Database::Query($this->pog_query, $connection); + if ($rows > 0) + { + $this->pog_query = "update `user` set + `username`='".$this->Escape($this->username)."', + `srp_s`='".$this->Escape($this->srp_s)."', + `srp_v`='".$this->Escape($this->srp_v)."', + `header`='".$this->Escape($this->header)."', + `statistics`='".$this->Escape($this->statistics)."', + `auth_version`='".$this->Escape($this->auth_version)."', + `version`='".$this->Escape($this->version)."', + `lock`='".$this->Escape($this->lock)."'where `userid`='".$this->userId."'"; + } + else + { + $this->pog_query = "insert into `user` (`username`, `srp_s`, `srp_v`, `header`, `statistics`, `auth_version`, `version`, `lock`) values ( + '".$this->Escape($this->username)."', + '".$this->Escape($this->srp_s)."', + '".$this->Escape($this->srp_v)."', + '".$this->Escape($this->header)."', + '".$this->Escape($this->statistics)."', + '".$this->Escape($this->auth_version)."', + '".$this->Escape($this->version)."', + '".$this->Escape($this->lock)."')"; + } + $insertId = Database::InsertOrUpdate($this->pog_query, $connection); + if ($this->userId == "") + { + $this->userId = $insertId; + } + if ($deep) + { + foreach ($this->_recordList as $record) + { + $record->userId = $this->userId; + $record->Save($deep); + } + foreach ($this->_onetimepasswordList as $onetimepassword) + { + $onetimepassword->userId = $this->userId; + $onetimepassword->Save($deep); + } + } + return $this->userId; + } + + + /** + * Clones the object and saves it to the database + * @return integer $userId + */ + function SaveNew($deep = false) + { + $this->userId = ''; + return $this->Save($deep); + } + + + /** + * Deletes the object from the database + * @return boolean + */ + function Delete($deep = false, $across = false) + { + if ($deep) + { + $recordList = $this->GetRecordList(); + foreach ($recordList as $record) + { + $record->Delete($deep, $across); + } + $onetimepasswordList = $this->GetOnetimepasswordList(); + foreach ($onetimepasswordList as $onetimepassword) + { + $onetimepassword->Delete($deep, $across); + } + } + $connection = Database::Connect(); + $this->pog_query = "delete from `user` where `userid`='".$this->userId."'"; + return Database::NonQuery($this->pog_query, $connection); + } + + + /** + * Deletes a list of objects that match given conditions + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param bool $deep + * @return + */ + function DeleteList($fcv_array, $deep = false, $across = false) + { + if (sizeof($fcv_array) > 0) + { + if ($deep || $across) + { + $objectList = $this->GetList($fcv_array); + foreach ($objectList as $object) + { + $object->Delete($deep, $across); + } + } + else + { + $connection = Database::Connect(); + $pog_query = "delete from `user` where "; + for ($i=0, $c=sizeof($fcv_array); $i<$c; $i++) + { + if (sizeof($fcv_array[$i]) == 1) + { + $pog_query .= " ".$fcv_array[$i][0]." "; + continue; + } + else + { + if ($i > 0 && sizeof($fcv_array[$i-1]) !== 1) + { + $pog_query .= " AND "; + } + if (isset($this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes']) && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'NUMERIC' && $this->pog_attribute_type[$fcv_array[$i][0]]['db_attributes'][0] != 'SET') + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$this->Escape($fcv_array[$i][2])."'"; + } + else + { + $pog_query .= "`".$fcv_array[$i][0]."` ".$fcv_array[$i][1]." '".$fcv_array[$i][2]."'"; + } + } + } + return Database::NonQuery($pog_query, $connection); + } + } + } + + + /** + * Gets a list of record objects associated to this one + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array of record objects + */ + function GetRecordList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $record = new record(); + $fcv_array[] = array("userId", "=", $this->userId); + $dbObjects = $record->GetList($fcv_array, $sortBy, $ascending, $limit); + return $dbObjects; + } + + + /** + * Makes this the parent of all record objects in the record List array. Any existing record will become orphan(s) + * @return null + */ + function SetRecordList(&$list) + { + $this->_recordList = array(); + $existingRecordList = $this->GetRecordList(); + foreach ($existingRecordList as $record) + { + $record->userId = ''; + $record->Save(false); + } + $this->_recordList = $list; + } + + + /** + * Associates the record object to this one + * @return + */ + function AddRecord(&$record) + { + $record->userId = $this->userId; + $found = false; + foreach($this->_recordList as $record2) + { + if ($record->recordId > 0 && $record->recordId == $record2->recordId) + { + $found = true; + break; + } + } + if (!$found) + { + $this->_recordList[] = $record; + } + } + + + /** + * Gets a list of onetimepassword objects associated to this one + * @param multidimensional array {("field", "comparator", "value"), ("field", "comparator", "value"), ...} + * @param string $sortBy + * @param boolean $ascending + * @param int limit + * @return array of onetimepassword objects + */ + function GetOnetimepasswordList($fcv_array = array(), $sortBy='', $ascending=true, $limit='') + { + $onetimepassword = new onetimepassword(); + $fcv_array[] = array("userId", "=", $this->userId); + $dbObjects = $onetimepassword->GetList($fcv_array, $sortBy, $ascending, $limit); + return $dbObjects; + } + + + /** + * Makes this the parent of all onetimepassword objects in the onetimepassword List array. Any existing onetimepassword will become orphan(s) + * @return null + */ + function SetOnetimepasswordList(&$list) + { + $this->_onetimepasswordList = array(); + $existingOnetimepasswordList = $this->GetOnetimepasswordList(); + foreach ($existingOnetimepasswordList as $onetimepassword) + { + $onetimepassword->userId = ''; + $onetimepassword->Save(false); + } + $this->_onetimepasswordList = $list; + } + + + /** + * Associates the onetimepassword object to this one + * @return + */ + function AddOnetimepassword(&$onetimepassword) + { + $onetimepassword->userId = $this->userId; + $found = false; + foreach($this->_onetimepasswordList as $onetimepassword2) + { + if ($onetimepassword->onetimepasswordId > 0 && $onetimepassword->onetimepasswordId == $onetimepassword2->onetimepasswordId) + { + $found = true; + break; + } + } + if (!$found) + { + $this->_onetimepasswordList[] = $onetimepassword; + } + } +} +?> \ No newline at end of file diff --git a/README b/backend/php/src/objects/ignore_objects.txt similarity index 100% rename from README rename to backend/php/src/objects/ignore_objects.txt diff --git a/backend/php/src/plugins/IPlugin.php b/backend/php/src/plugins/IPlugin.php new file mode 100644 index 0000000..3e39e70 --- /dev/null +++ b/backend/php/src/plugins/IPlugin.php @@ -0,0 +1,48 @@ + \ No newline at end of file diff --git a/backend/php/src/plugins/base64_install.sql b/backend/php/src/plugins/base64_install.sql new file mode 100644 index 0000000..40401d6 --- /dev/null +++ b/backend/php/src/plugins/base64_install.sql @@ -0,0 +1,172 @@ +-- base64.sql - MySQL base64 encoding/decoding functions +-- Copyright (C) 2006 Ian Gulliver +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of version 2 of the GNU General Public License as +-- published by the Free Software Foundation. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +DROP TABLE IF EXISTS base64_data | +CREATE TABLE base64_data (c CHAR(1) BINARY, val TINYINT) | +INSERT INTO base64_data VALUES + ('A',0), ('B',1), ('C',2), ('D',3), ('E',4), ('F',5), ('G',6), ('H',7), ('I',8), ('J',9), + ('K',10), ('L',11), ('M',12), ('N',13), ('O',14), ('P',15), ('Q',16), ('R',17), ('S',18), ('T',19), + ('U',20), ('V',21), ('W',22), ('X',23), ('Y',24), ('Z',25), ('a',26), ('b',27), ('c',28), ('d',29), + ('e',30), ('f',31), ('g',32), ('h',33), ('i',34), ('j',35), ('k',36), ('l',37), ('m',38), ('n',39), + ('o',40), ('p',41), ('q',42), ('r',43), ('s',44), ('t',45), ('u',46), ('v',47), ('w',48), ('x',49), + ('y',50), ('z',51), ('0',52), ('1',53), ('2',54), ('3',55), ('4',56), ('5',57), ('6',58), ('7',59), + ('8',60), ('9',61), ('+',62), ('/',63), ('=',0) | + + +DROP FUNCTION IF EXISTS BASE64_DECODE | +CREATE FUNCTION BASE64_DECODE (input BLOB) + RETURNS BLOB + CONTAINS SQL + DETERMINISTIC + SQL SECURITY INVOKER +BEGIN + DECLARE ret BLOB DEFAULT ''; + DECLARE done TINYINT DEFAULT 0; + + IF input IS NULL THEN + RETURN NULL; + END IF; + +each_block: + WHILE NOT done DO BEGIN + DECLARE accum_value BIGINT UNSIGNED DEFAULT 0; + DECLARE in_count TINYINT DEFAULT 0; + DECLARE out_count TINYINT DEFAULT 3; + +each_input_char: + WHILE in_count < 4 DO BEGIN + DECLARE first_char CHAR(1); + + IF LENGTH(input) = 0 THEN + RETURN ret; + END IF; + + SET first_char = SUBSTRING(input,1,1); + SET input = SUBSTRING(input,2); + + BEGIN + DECLARE tempval TINYINT UNSIGNED; + DECLARE error TINYINT DEFAULT 0; + DECLARE base64_getval CURSOR FOR SELECT val FROM base64_data WHERE c = first_char; + DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET error = 1; + + OPEN base64_getval; + FETCH base64_getval INTO tempval; + CLOSE base64_getval; + + IF error THEN + ITERATE each_input_char; + END IF; + + SET accum_value = (accum_value << 6) + tempval; + END; + + SET in_count = in_count + 1; + + IF first_char = '=' THEN + SET done = 1; + SET out_count = out_count - 1; + END IF; + END; END WHILE; + + -- We've now accumulated 24 bits; deaccumulate into bytes + + -- We have to work from the left, so use the third byte position and shift left + WHILE out_count > 0 DO BEGIN + SET ret = CONCAT(ret,CHAR((accum_value & 0xff0000) >> 16)); + SET out_count = out_count - 1; + SET accum_value = (accum_value << 8) & 0xffffff; + END; END WHILE; + + END; END WHILE; + + RETURN ret; +END | + +DROP FUNCTION IF EXISTS BASE64_ENCODE | +CREATE FUNCTION BASE64_ENCODE (input BLOB) + RETURNS BLOB + CONTAINS SQL + DETERMINISTIC + SQL SECURITY INVOKER +BEGIN + DECLARE ret BLOB DEFAULT ''; + DECLARE done TINYINT DEFAULT 0; + + IF input IS NULL THEN + RETURN NULL; + END IF; + +each_block: + WHILE NOT done DO BEGIN + DECLARE accum_value BIGINT UNSIGNED DEFAULT 0; + DECLARE in_count TINYINT DEFAULT 0; + DECLARE out_count TINYINT; + +each_input_char: + WHILE in_count < 3 DO BEGIN + DECLARE first_char CHAR(1); + + IF LENGTH(input) = 0 THEN + SET done = 1; + SET accum_value = accum_value << (8 * (3 - in_count)); + LEAVE each_input_char; + END IF; + + SET first_char = SUBSTRING(input,1,1); + SET input = SUBSTRING(input,2); + + SET accum_value = (accum_value << 8) + ASCII(first_char); + + SET in_count = in_count + 1; + END; END WHILE; + + -- We've now accumulated 24 bits; deaccumulate into base64 characters + + -- We have to work from the left, so use the third byte position and shift left + CASE + WHEN in_count = 3 THEN SET out_count = 4; + WHEN in_count = 2 THEN SET out_count = 3; + WHEN in_count = 1 THEN SET out_count = 2; + ELSE RETURN ret; + END CASE; + + WHILE out_count > 0 DO BEGIN + BEGIN + DECLARE out_char CHAR(1); + DECLARE base64_getval CURSOR FOR SELECT c FROM base64_data WHERE val = (accum_value >> 18); + + OPEN base64_getval; + FETCH base64_getval INTO out_char; + CLOSE base64_getval; + + SET ret = CONCAT(ret,out_char); + SET out_count = out_count - 1; + SET accum_value = accum_value << 6 & 0xffffff; + END; + END; END WHILE; + + CASE + WHEN in_count = 2 THEN SET ret = CONCAT(ret,'='); + WHEN in_count = 1 THEN SET ret = CONCAT(ret,'=='); + ELSE BEGIN END; + END CASE; + + END; END WHILE; + + RETURN ret; +END | diff --git a/backend/php/src/plugins/base64_uninstall.sql b/backend/php/src/plugins/base64_uninstall.sql new file mode 100644 index 0000000..02b9b6b --- /dev/null +++ b/backend/php/src/plugins/base64_uninstall.sql @@ -0,0 +1,20 @@ +-- base64.sql - MySQL base64 encoding/decoding functions +-- Copyright (C) 2006 Ian Gulliver +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of version 2 of the GNU General Public License as +-- published by the Free Software Foundation. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +DROP TABLE IF EXISTS base64_data | +DROP FUNCTION IF EXISTS BASE64_DECODE | +DROP FUNCTION IF EXISTS BASE64_ENCODE | \ No newline at end of file diff --git a/backend/php/src/plugins/plugin.base64.php b/backend/php/src/plugins/plugin.base64.php new file mode 100644 index 0000000..323f861 --- /dev/null +++ b/backend/php/src/plugins/plugin.base64.php @@ -0,0 +1,128 @@ +version; + } + + function Base64($sourceObject, $argv) + { + $this->sourceObject = $sourceObject; + $this->argv = $argv; + } + + function Execute() + { + return null; + } + + function SetupRender() + { + if (isset($_POST['install_base64']) || isset($_POST['uninstall_base64'])) + { + $this->SetupExecute(); + } + else + { + $out = "This plugin allows you to install and uninstall a base64 custom function to and from your database. + You can then set \$configuration['db_encoding'] = 1 so that all data is transparently encoded and decoded + with the minimal overhead possible. Enabling data encoding has quite a few advantages:

+ + "; + $out .= "

"; + } + else + { + $out .= "\n\tChecking MySQL function....NOT INSTALLED"; + $out .= "\n\tChecking db_encoding status ignored"; + $out .= "\n\n---------------------------------------------------"; + $out .= "\nClick the INSTALL button below to install the base64 function to your database."; + $out .= "
"; + } + $out .= ""; + echo $out; + } + } + + function AuthorPage() + { + return null; + } + + + function SetupExecute() + { + $out = ''; + $connection = Database::Connect(); + if (isset($_POST['install_base64']) && isset($_POST['install_base64']) == true) + { + $initialData = file_get_contents('../plugins/base64_install.sql'); + $statements = explode('|', $initialData); + if (sizeof($statements) > 0) + { + foreach ($statements as $statement) + { + if (trim($statement) != '') + { + Database::NonQuery($statement, $connection); + } + } + } + $out .= ""; + } + else if (isset($_POST['uninstall_base64']) && $_POST['uninstall_base64'] == true) + { + $initialData = file_get_contents('../plugins/base64_uninstall.sql'); + $statements = explode('|', $initialData); + if (sizeof($statements) > 0) + { + foreach ($statements as $statement) + { + if (trim($statement) != '') + { + Database::NonQuery($statement, $connection); + } + } + } + $out .= ""; + } + echo $out; + } + + function IsBase64FunctionInstalled() + { + $sql1 = "show function status where Db='".$GLOBALS['configuration']['db']."' and (Name='BASE64_DECODE' or Name='BASE64_ENCODE')"; + $sql2 = "show tables like 'base64_data'"; + $connection = Database::Connect(); + $result = Database::Query($sql1, $connection); + $result2 = Database::Query($sql2, $connection); + if ($result == 2 && $result2 == 1) + { + return true; + } + return false; + } +} diff --git a/backend/php/src/setup/data_initialization/additional_table_structures.sql b/backend/php/src/setup/data_initialization/additional_table_structures.sql new file mode 100644 index 0000000..e69de29 diff --git a/backend/php/src/setup/data_initialization/data_initialization.sql b/backend/php/src/setup/data_initialization/data_initialization.sql new file mode 100644 index 0000000..e69de29 diff --git a/backend/php/src/setup/data_initialization/howto.txt b/backend/php/src/setup/data_initialization/howto.txt new file mode 100644 index 0000000..a6f0e24 --- /dev/null +++ b/backend/php/src/setup/data_initialization/howto.txt @@ -0,0 +1,13 @@ +Hello there, + +To make use of the Data Initialization feature in POG Setup, put your insert statements in the data_initialization.sql file. (One per line). +Then, on step 1 of Setup, choose "Drop, recreate tables and reset data": + +This will + +1. Drop any tables that have the same name as the object(s) you have in the objects folder. +2. Recreate the tables and indexes(if needed) +3. Execute the insert statements in data_initialization.sql one by one. + +Regards, +The POG Team \ No newline at end of file diff --git a/backend/php/src/setup/data_initialization/read_dump_lib.php b/backend/php/src/setup/data_initialization/read_dump_lib.php new file mode 100644 index 0000000..ed579ab --- /dev/null +++ b/backend/php/src/setup/data_initialization/read_dump_lib.php @@ -0,0 +1,205 @@ + add the current substring to the + // returned array + if (!$i) { + $ret[] = array('query' => $sql, 'empty' => $nothing); + return TRUE; + } + // Backquotes or no backslashes before quotes: it's indeed the + // end of the string -> exit the loop + elseif ($string_start == '`' || $sql[$i-1] != '\\') { + $string_start = ''; + $in_string = FALSE; + break; + } + // one or more Backslashes before the presumed end of string... + else { + // ... first checks for escaped backslashes + $j = 2; + $escaped_backslash = FALSE; + while ($i-$j > 0 && $sql[$i-$j] == '\\') { + $escaped_backslash = !$escaped_backslash; + $j++; + } + // ... if escaped backslashes: it's really the end of the + // string -> exit the loop + if ($escaped_backslash) { + $string_start = ''; + $in_string = FALSE; + break; + } + // ... else loop + else { + $i++; + } + } // end if...elseif...else + } // end for + } // end if (in string) + + // lets skip comments (/*, -- and #) + elseif (($char == '-' && $sql_len > $i + 2 && $sql[$i + 1] == '-' && $sql[$i + 2] <= ' ') || $char == '#' || ($char == '/' && $sql_len > $i + 1 && $sql[$i + 1] == '*')) { + $i = strpos($sql, $char == '/' ? '*/' : "\n", $i); + // didn't we hit end of string? + if ($i === FALSE) { + break; + } + if ($char == '/') { + $i++; + } + } + + // We are not in a string, first check for delimiter... + elseif ($char == ';') { + // if delimiter found, add the parsed part to the returned array + $ret[] = array('query' => substr($sql, 0, $i), 'empty' => $nothing); + $nothing = TRUE; + $sql = ltrim(substr($sql, min($i + 1, $sql_len))); + $sql_len = strlen($sql); + if ($sql_len) { + $i = -1; + } else { + // The submited statement(s) end(s) here + return TRUE; + } + } // end elseif (is delimiter) + + // ... then check for start of a string,... + elseif (($char == '"') || ($char == '\'') || ($char == '`')) { + $in_string = TRUE; + $nothing = FALSE; + $string_start = $char; + } // end elseif (is start of string) + + elseif ($nothing) { + $nothing = FALSE; + } + + // loic1: send a fake header each 30 sec. to bypass browser timeout + $time1 = time(); + if ($time1 >= $time0 + 30) { + $time0 = $time1; + header('X-pmaPing: Pong'); + } // end if + } // end for + + // add any rest to the returned array + if (!empty($sql) && preg_match('@[^[:space:]]+@', $sql)) { + $ret[] = array('query' => $sql, 'empty' => $nothing); + } + + return TRUE; +} // end of the 'PMA_splitSqlFile()' function + + +/** + * Reads (and decompresses) a (compressed) file into a string + * + * @param string the path to the file + * @param string the MIME type of the file, if empty MIME type is autodetected + * + * @global array the phpMyAdmin configuration + * + * @return string the content of the file or + * boolean FALSE in case of an error. + */ +function PMA_readFile($path, $mime = '') { + global $cfg; + + if (!file_exists($path)) { + return FALSE; + } + switch ($mime) { + case '': + $file = @fopen($path, 'rb'); + if (!$file) { + return FALSE; + } + $test = fread($file, 3); + fclose($file); + if ($test[0] == chr(31) && $test[1] == chr(139)) { + return PMA_readFile($path, 'application/x-gzip'); + } + if ($test == 'BZh') { + return PMA_readFile($path, 'application/x-bzip'); + } + return PMA_readFile($path, 'text/plain'); + case 'text/plain': + $file = @fopen($path, 'rb'); + if (!$file) { + return FALSE; + } + $content = fread($file, filesize($path)); + fclose($file); + break; + case 'application/x-gzip': + if ($cfg['GZipDump'] && @function_exists('gzopen')) { + $file = @gzopen($path, 'rb'); + if (!$file) { + return FALSE; + } + $content = ''; + while (!gzeof($file)) { + $content .= gzgetc($file); + } + gzclose($file); + } else { + return FALSE; + } + break; + case 'application/x-bzip': + if ($cfg['BZipDump'] && @function_exists('bzdecompress')) { + $file = @fopen($path, 'rb'); + if (!$file) { + return FALSE; + } + $content = fread($file, filesize($path)); + fclose($file); + $content = bzdecompress($content); + } else { + return FALSE; + } + break; + default: + return FALSE; + } + return $content; +} + +?> diff --git a/backend/php/src/setup/index.php b/backend/php/src/setup/index.php new file mode 100644 index 0000000..4087961 --- /dev/null +++ b/backend/php/src/setup/index.php @@ -0,0 +1,717 @@ + + + 0 && $_SESSION['diagnosticsSuccessful']==false) +{ +?> +
+
+
+
+
POG setup diagnostics
+
Setup performs unit tests on all your objects in the object directory and makes sure they're OK.
This makes sure that your objects can talk to your database correctly. This can also be useful if you modify / customize the objects manually and want to make sure they still work once you're done. +

The diagnostics screen on the right shows the results of those tests. If all tests pass successfully, you can be assured that all objects are working correctly. +
+
+
+
+ + + + + + + + +
 
+$ignoreObject){ + $ignoreObjects[$key] = trim($ignoreObject); + } + + $dir = opendir('../objects/'); + $objects = array(); + while(($file = readdir($dir)) !== false) + { + if(strlen($file) > 4 && substr(strtolower($file), strlen($file) - 4) === '.php' && !is_dir($file) && $file != "class.database.php" && $file != "class.pog_base.php") + { + $objects[] = $file; + include_once("../objects/{$file}"); + } + } + closedir($dir); + if (sizeof($objects) == 0) + { + $errors++; + AddError("[objects] folder does not contain any POG object."); + } + + if ($errors == 0) + { + $dir = opendir($GLOBALS['configuration']['plugins_path']); + $plugins = array(); + + while(($file = readdir($dir)) !== false) + { + if(file_exists($GLOBALS['configuration']['plugins_path']."/IPlugin.php")) + { + include_once($GLOBALS['configuration']['plugins_path']."/IPlugin.php"); + } + if(strlen($file) > 4 && substr(strtolower($file), strlen($file) - 4) === '.php' && !is_dir($file) && strtolower(substr($file, 0, 6)) == 'plugin') + { + include_once($GLOBALS['configuration']['plugins_path']."/{$file}"); + $pluginName = GetPluginName($file); + if ($pluginName != '') + { + $plugins[] = $file; + } + + } + } + closedir($dir); + } + + /** + * verify configuration info + */ + if ($errors == 0) + { + AddTrace('File Structure....OK!'); + if (!@mysql_connect ($GLOBALS['configuration']['host'].":".$GLOBALS['configuration']['port'], $GLOBALS['configuration']['user'], $GLOBALS['configuration']['pass'])) + { + $errors++; + AddError('Cannot connect to the specified database server. Edit configuration.php'); + } + if (isset($GLOBALS['configuration']['db_encoding']) && $GLOBALS['configuration']['db_encoding'] == 1 && !Base64::IsBase64FunctionInstalled()) + { + $errors++; + AddError('$configuration[db_encoding] needs to be set to 0 until you install the base64 plugin. Set db_encoding to 0 by editing configuration.php, run setup again and go to the "Manage Plugins" tab. Install the base64 plugin. Then you can set db_encoding = 1'); + } + if ($errors == 0) + { + if (!@mysql_select_db ($GLOBALS['configuration']['db'])) + { + $errors++; + AddError('Cannot find the specified database "'.$GLOBALS['configuration']['db'].'". Edit configuration.php'); + } + } + } + + /** + * verify storage status + */ + + if ($errors == 0) + { + AddTrace("Configuration Info....OK!\n"); + AddTrace("Storage Status"); + foreach($objects as $object) + { + $objectName = GetObjectName("../objects/".$object); + eval ('$instance = new '.$objectName.'();'); + if (TestStorageExists($objectName, "mysql")) + { + if (isset($_POST['pog_table']) && ($_POST['pog_table'] == "recreate" || $_POST['pog_table'] == "recreate_import")) + { + if (!TestDeleteStorage($instance)) + { + $errors++; + AddError("Dropping table '".strtolower($objectName)."' failed. Drop and recreate the table manually."); + } + else + { + if (!TestCreateStorage("../objects/".$object)) + { + $errors++; + AddError("Creating table [".strtolower($objectName)."] failed. Create the table manually using the generated SQL query in the object header."); + } + else + { + AddTrace("\tDropping & Recreating table [".strtolower($objectName)."]....OK!"); + } + } + } + else + { + if (!TestAlterStorage($instance)) + { + $errors++; + AddError("Aligning [$objectName] with table '".strtolower($objectName)."' failed. Alter the table manually so that object attributes and table columns match."); + } + else + { + AddTrace("\tAligning [$objectName] with table '".strtolower($objectName)."'....OK!"); + } + } + } + else + { + if (!TestCreateStorage("../objects/".$object)) + { + $errors++; + AddError("Creating table [".strtolower($objectName)."] failed. Create the table manually using the generated SQL query in the object header."); + } + else + { + AddTrace("\tCreating table [".strtolower($objectName)."]....OK!"); + } + } + } + } + + $objectNameList = array(); + + /** + * Initialize test data? + */ + if (isset($_POST['pog_table']) && $_POST['pog_table'] == 'recreate_import') + { + $initialData = file_get_contents('data_initialization/data_initialization.sql'); + PMA_splitSqlFile($statements, $initialData, 4); + if (sizeof($statements) > 0) + { + foreach ($statements as $statement) + { + if (!TestExecuteQuery($statement['query'])) + + { + $errors++; + AddError('Statement "'.$statement['query'].'" failed'); + } + } + } + $structure_changes = file_get_contents('data_initialization/additional_table_structures.sql'); + unset($statements); + PMA_splitSqlFile($statements, $structure_changes, 4); + if (sizeof($statements) > 0) + { + foreach ($statements as $statement) + { + if (!TestExecuteQuery($statement['query'])) + + { + $errors++; + AddError('Statement "'.$statement['query'].'" failed'); + } + } + } + } + + + /** + * verify object status + */ + $objectNameList = array(); + foreach($objects as $object) + { + $objectName = GetObjectName("../objects/".$object); + if (isset($objectName) && array_search($objectName, $ignoreObjects) ===false) + { + $objectNameList[] = $objectName; + } + } + + if ($errors == 0) + { + $pluginNameList = array(); + foreach($plugins as $plugin) + { + $pluginName = GetPluginName($plugin); + if ($pluginName != '') + { + $pluginNameList[] = $pluginName; + } + } + } + + + if ($errors == 0 && isset($_POST['pog_test']) && $_POST['pog_test'] == 'yes') + { + AddTrace("\nPOG Essentials"); + + $_SESSION['links'] = array(); + + $objectCount = 1; + foreach($objects as $object) + { + $objectName = GetObjectName("../objects/".$object); + if (isset($objectName) && array_search($objectName, $ignoreObjects) ===false) + { + eval('$instance = new '.$objectName.'();'); + AddTrace("\t[".$objectName."]"); + + $link = GetAtLink("../objects/".$object); + $_SESSION['links'][$objectName] = $link; + + if (!TestEssentials($instance)) + { + $errors++; + AddError("Object $objectName failed essential tests"); + } + if ($objectCount != sizeof($objects)) + { + AddTrace("\t***"); + } + } + $objectCount++; + } + } + + + if ($errors == 0 && isset($_POST['pog_test']) && $_POST['pog_test'] == 'yes') + { + AddTrace("\nPOG Relations PreRequisites"); + $objectCount = 1; + foreach ($objects as $object) + { + $objectName = GetObjectName("../objects/".$object); + if (isset($objectName) && array_search($objectName, $ignoreObjects) ===false) + { + eval('$instance = new '.$objectName.'();'); + AddTrace("\t[".$objectName."]"); + if (!TestRelationsPreRequisites($instance, $objectNameList, $objectName, $ignoreObjects)) + { + $errors++; + } + if ($objectCount != sizeof($objects)) + { + AddTrace("\t***"); + } + } + $objectCount++; + } + } + + + if ($errors == 0 && isset($_POST['pog_test']) && $_POST['pog_test'] == 'yes') + { + AddTrace("\nPOG Relations"); + $objectCount = 1; + foreach ($objects as $object) + { + $objectName = GetObjectName("../objects/".$object); + if (isset($objectName) && array_search($objectName, $ignoreObjects) ===false) + { + eval('$instance = new '.$objectName.'();'); + AddTrace("\t[".$objectName."]"); + if (!TestRelations($instance, $objectNameList, $ignoreObjects)) + { + $errors++; + AddError("Object $objectName failed relations tests"); + } + if ($objectCount != sizeof($objects)) + { + AddTrace("\t***"); + } + } + $objectCount++; + } + } + if ($errors == 0) + { + $_SESSION['diagnosticsSuccessful'] = true; + } + if(isset($_POST['pog_test']) && $_POST['pog_test'] == 'no') + { + AddTrace("\nUNIT TESTS NOT PERFORMED. FOUND $errors ERROR(S)"); + } + else + { + AddTrace("\nCHECKED ".count($objectNameList)." OBJECT(S). FOUND $errors ERROR(S)".($errors == 0 ? ". HURRAY!" : ":")); + } + AddTrace("---------------------------------------------------"); + if (isset($_SESSION['errorMessages'])) + { + $errorMessages = unserialize($_SESSION['errorMessages']); + } + $traceMessages = unserialize($_SESSION['traceMessages']); + $diagnostics = ''; + foreach ($traceMessages as $traceMessage) + { + $diagnostics .= "\n$traceMessage"; + } + if (isset($errorMessages)) + { + foreach ($errorMessages as $errorMessage) + { + $diagnostics .= "\n$errorMessage\n"; + } + } + $_SESSION['fileNames'] = serialize($objects); + $_SESSION['objectNameList'] = serialize($objectNameList); + if (isset($pluginNameList)) + { + $_SESSION['pluginNameList'] = serialize($pluginNameList); + } + } + echo "


"; + if ($_SESSION['diagnosticsSuccessful']) + { + echo ''; + } + unset($_POST, $instanceId, $_SESSION['traceMessages'], $_SESSION['errorMessages']); +?> +
+
+ +
+
+
+
+
POG documentation summary
+

The following 3 documents summarize what POG is all about:

+ 1. POG Essentials

+ 2. POG Object Relations

+ 3. POG SOAP API +
+
+
+
+ + + + + + + 0) + { +?> + + +
+ + +
+
delete allexpand allcollapse allupdate all objects
+ GetList(array(array($instanceId, ">", "0"))); + foreach ($instanceList as $instance) + { + $instance->Delete(); + } + unset($_GET); + } + echo '
'; + $_SESSION['fileNames'] = serialize($fileNames); + $_SESSION['objectNameList'] = serialize($objectNameList); +?> + +
+
+
+
+sndReq('GetList', '', '$objectName', '', '', '', '$objectName');"; +} +else if ($_SESSION['diagnosticsSuccessful'] && $_GET['plugins']) +{ +?> +
+
+
+
+
POG documentation summary
+

The following 3 documents summarize what POG is all about:

+ 1. POG Essentials

+ 2. POG Object Relations

+ 3. POG SOAP API +
+
+
+
+ + + + + + + +
+ + +
+
+ + + AuthorPage() != null) + { + ?> + + + + +
+
'; + $pluginInstance->SetupRender(); + echo '
'; + $_SESSION['pluginNameList'] = serialize($pluginNameList); +?> + +
+
+ +
+ +
+
+
+ +
What is POG Setup?
POG Setup is an extension of the online Php Object Generator. It is meant to help the veteran POG user and the novice alike. +

POG Setup is a 3 step process which:

+ 1. Creates tables for your generated objects.

+ 2. Performs diagnostics tests on all objects within your 'objects' directory.

+ 3. Provides a light interface to your object tables.
+
+
+
+ + + + + + + +
+
+
+ +
What is POG?
POG generates PHP objects with integrated CRUD methods to dramatically accelerate web application development in PHP.
+
POG allows developers to easily map object attributes onto columns of a database table without having to write SQL queries.
+
What is POG Setup?
You've generated one or more objects using Php Object Generator ... Now what?
+
POG SETUP is an answer to this question and takes the POG experience one step further. The Setup process automates table creation, unit testing and provides a light scaffolding environment.
+
+
If you are ready to get POG'd up, click on thebutton below to proceed. Doing this will:

+ + + + + + + + + +
TABLES: + +
TESTS: + +

+
+ +
+
+ +
+
+
+
+ + + + diff --git a/backend/php/src/setup/rpc.php b/backend/php/src/setup/rpc.php new file mode 100644 index 0000000..2e2d0c1 --- /dev/null +++ b/backend/php/src/setup/rpc.php @@ -0,0 +1,227 @@ + 4 && substr(strtolower($file), strlen($file) - 4) === '.php' && !is_dir($file) && $file != "class.database.php" && $file != "configuration.php" && $file != "setup.php" && $file != "class.pog_base.php") + { + $objects[] = $file; + } +} +closedir($dir); +foreach ($objects as $object) +{ + include_once("../objects/{$object}"); +} + +eval ('$instance = new '.$objectName.'();'); +$attributeList = array_keys(get_object_vars($instance)); +$noOfExternalAttributes = sizeof($attributeList) - 3; + +// get object id to perform action. required for Delete() and Update() +$objectId = isset($_REQUEST['objectid']) ? $_REQUEST['objectid'] : ''; + +// get the ids of all open nodes before action is performed +$openNodes = isset($_REQUEST['opennodes']) ? explode('-', $_REQUEST['opennodes']) : ''; + +// get action to perform +$action = $_GET['action']; + +$currentNode = -1; +if (isset($_GET['currentnode'])) +{ + // get the node id on which the action is performed. required for Delete() and Update() + $currentNode = $_GET['currentnode']; + $currentNodeParts = explode('Xnode', $currentNode); + if (isset($currentNodeParts[1])) + { + $currentNode = $currentNodeParts[1]; + } +} +$root = new XMenu(); + +if ($openNodes != '') +{ + foreach ($openNodes as $openNode) + { + $openNodeParts = explode('Xtree', $openNode); + $noParts = sizeof($openNodeParts); + + // all open nodes when action is initiated + if ($noParts > 0 && is_numeric($openNodeParts[$noParts - 1])) + { + // initialize all open nodes + $root->visibleNodes[] = $openNodeParts[$noParts - 1]; + } + } +} +// perform requested action +switch($action) +{ + case 'Add': + eval ('$instance = new '.$objectName.'();'); + $attributeList = array_keys(get_object_vars($instance)); + foreach($attributeList as $attribute) + { + if ($attribute != "pog_attribute_type" && $attribute!= "pog_query") + { + if (isset($instance->pog_attribute_type[$attribute])) + { + if (isset($_GET[$attribute])) + { + $instance->{$attribute} = $_GET[$attribute]; + } + } + } + } + if ($instance->Save()) + { + for ($i = 0; $i < sizeof($root->visibleNodes); $i++) + { + if ($root->visibleNodes[$i] > ($noOfExternalAttributes + 2)) + { + $root->visibleNodes[$i] += ($noOfExternalAttributes + 1); + } + } + } + RefreshTree($anchor, $root); + break; + case 'Refresh': + RefreshTree($objectName, $root, $offset, $limit); + break; + case 'GetList': + RefreshTree($anchor, $root, $offset, $limit); + break; + case 'DeleteDeep': + case 'Delete': + eval ('$instance = new '.$objectName.'();'); + $instance->Get($objectId); + $instance->Delete(($action == 'DeleteDeep')); + for ($i = 0; $i < sizeof($root->visibleNodes); $i++) + { + if ($root->visibleNodes[$i] > ($noOfExternalAttributes + 2)) + { + if (intval($root->visibleNodes[$i]) == intval($openNodeParts[$noParts - 1])) + { + $root->visibleNodes[$i] = null; + } + else if ($root->visibleNodes[$i] > $currentNode) + { + $root->visibleNodes[$i] -= ($noOfExternalAttributes + 1); + } + } + } + RefreshTree($anchor, $root); + break; + case 'Update': + eval ('$instance = new '.$objectName.'();'); + $instance->Get($objectId); + $attributeList = array_keys(get_object_vars($instance)); + foreach($attributeList as $attribute) + { + if ($attribute != "pog_attribute_type" && $attribute!= "pog_query") + { + if (isset($instance->pog_attribute_type[$attribute])) + { + if (isset($_GET[$attribute])) + { + $instance->{$attribute} = $_GET[$attribute]; + } + } + } + } + $instance->Save(); + RefreshTree($anchor, $root); + break; + } + + /** + * Refreshes the tree after an operation while preserving node statuses + * + * @param unknown_type $objectName + * @param unknown_type $root + */ + function RefreshTree($objectName, $root, $offset = '', $limit = '') + { + if ($limit == '') + { + $offset = 0; + $limit = 50; + } + $sqlLimit = "$offset, $limit"; + + $js = "new Array("; + eval ('$instance = new '.$objectName.'();'); + $recCount = GetNumberOfRecords(strtolower($objectName)); + $attributeList = array_keys(get_object_vars($instance)); + $instanceList = $instance->GetList(array(array(strtolower($objectName)."Id",">",0)), strtolower($objectName)."Id", false, $sqlLimit); + $x = 0; + $masterNode = &$root->addItem(new XNode("".$objectName." {Dimensions:[".sizeof($instanceList)."]}", false, "setup_images/folderclose.gif","setup_images/folderopen.gif")); + $node = &$masterNode->addItem(new XNode("ADD RECORD", false,"setup_images/folderclose.gif","setup_images/folderopen.gif")); + foreach($attributeList as $attribute) + { + if ($attribute != "pog_attribute_type" && $attribute!= "pog_query") + { + if ($x != 0 && isset($instance->pog_attribute_type[$attribute])) + { + $js .= '"'.$attribute.'",'; + $thisValue = ConvertAttributeToHtml($attribute, $instance->pog_attribute_type[$attribute]['db_attributes'], $instance->{$attribute}, $instance->{$attributeList[0]}); + $subnode = &$node->addItem(new XNode("
".$attribute." {".$instance->pog_attribute_type[$attribute]['db_attributes'][1]."}
".$thisValue."
", false,'',"setup_images/folderopen.gif")); + } + } + $x++; + } + $js = trim($js, ","); + $js .= ")"; + $subnode = &$node->addItem(new XNode("
", false,'',"folderopen.gif")); + + if ($instanceList != null) + { + foreach($instanceList as $instance) + { + ConvertObjectToNode($instance, $masterNode, $js, $objectName); + } + } + + $menu_html_code = $root->generateTree(); + $menu_html_code .= ""; + $table = "


".$pre.$menu_html_code."
"; + echo $table; + } +?> diff --git a/backend/php/src/setup/setup.css b/backend/php/src/setup/setup.css new file mode 100644 index 0000000..3c59e53 --- /dev/null +++ b/backend/php/src/setup/setup.css @@ -0,0 +1,77 @@ +.container {background:url('./setup_images/gradient_container.gif') top left repeat-x} +.logo {width:234px;height:191px;position:relative;float:left;background:url('./setup_images/setup_logo1.jpg') top left no-repeat} +.logo2 {width:234px;height:191px;position:relative;float:left;background:url('./setup_images/setup_logo2.jpg') top left no-repeat} +.logo3 {width:234px;height:191px;position:relative;float:left;background:url('./setup_images/setup_logo3.jpg') top left no-repeat} +.bottom3 {float:left;display:inline;position:relative;width:100%;background:url('./setup_images/setup_bottom3tile.jpg') top left repeat-x} +.toolbar {float:left;display:inline;width:100%;height:42px;background-color:#444;background:url('./setup_images/setup_toolbargradient.jpg') top left repeat-x} +body {margin:0 auto;padding:0;color:#828282;background:#fff;font:normal 10px Verdana} +.activetab {font-weight:bold;color:#7B7F0E;background:#ccc} +.error {background:#f00} +.warning {background:#0cf} +.succeed {background:#0f0} +.header {width:90%;height:90px;padding:15px 0 0 15px} +.footer {width:90%;padding-left:15px;vertical-align:middle;height:35px} +.footer img {vertical-align:middle;height:35px} +.toolbar img {display:inline} +.bottom3 img {display:inline} +.left {width:234px;height:550px;z-Index:9;position:absolute;} +.text {width:194px;height:319px;line-height:15px;position:relative;float:left;padding:22px} +.gold {color:#998D05;font-weight:bold;display:block;} +.middle {width:617px;padding-left:234px;height:596px;color:#404855} +.middle2 {float:left;position:relative;padding:20px 0 0 22px;width:594px;background:#E7E9EE} +.middle33 {height:596px;position:relative;padding-left:234px;color:#404855} +.middle3 {float:left;position:relative;width:100%;background:#E7E9EE} +.subtabs {padding-top:35px;float:left;position:relative} +#tabs {width:617px;height:20px;float:left} +#tabs3 {width:100%;height:20px;float:left} +#tabs img,#tabs3 img {float:left;border:none} +.middle img,.middle input,.middle2 img,.middle2 input {display:inline;margin:0;padding:0} +a {text-decoration:none;color:#7F7714} +input.i {position:relative;padding:2px 3px;width:200px;color:#5A4F64;font-size:9px;vertical-align:middle;border-top:1px solid #404040;border-left:1px solid #404040;border-right:1px solid #D1D0CC;border-bottom:1px solid #D1D0CC; background-color:#F7F7F7;} +textarea {width:575px;height:325px;font-size:12px;border-top:1px solid #404040;border-left:1px solid #404040;border-right:1px solid #D1D0CC;border-bottom:1px solid #D1D0CC} +textarea.t {width:450px;height:50px;font-size:12px;border-top:1px solid #404040; color:#5A4F64; border-left:1px solid #404040;border-right:1px solid #D1D0CC;border-bottom:1px solid #D1D0CC; background-color:#F7F7F7;} +select.s, input.c {border-top:1px solid #404040; color:#5A4F64; border-left:1px solid #404040;border-right:1px solid #D1D0CC;border-bottom:1px solid #D1D0CC; background-color:#F7F7F7;} +.ss{font-size:95%;} +table {position:relative;display:inline;background:#E8E9EE} +td {height:25px} +.id {font-weight:bold;padding-left:5px} +div#nifty {background:#E7E9EE;margin-top:40px;position:relative;float:left;width:617px} +div.nifty{margin-top:0;background:#E7E9EE} +b.rtop,b.rbottom {display:block;background:#FFF} +b.rtop b {display:block;height:1px;overflow:hidden;background:#FFF} +b.rbottom b {display:block;height:1px;overflow:hidden;background:#E7E9EE} +b.r1 {margin:0 5px} +b.r2 {margin:0 3px} +b.r3 {margin:0 2px} +b.rtop b.r4,b.rbottom b.r4 {margin:0 1px;height:2px} +.col1,.col2 {padding-left:15px;padding-right:15px;margin-left:10px;line-height:14px;color:#848484;position:relative;width:250px;height:270px;display:inline;float:left} +.col3 {width:300px;padding-left:150px;padding-right:150px;height:190px;display:block;float:left color:#848484} +#header {float:left;width:100%;line-height:normal;} +#header ul {margin:0;padding:8px 10px 0;list-style:none;color:#818183} +#header li {float:left;background:url("norm_right.gif") no-repeat right top;margin-right:5px;padding:0} +#header a {display:block;background:url("norm_left.gif") no-repeat left top;padding:3px 8px 2px;color:#B1B97D} +#header #current {background-image:url("./setup_images/tab_activeobjectright.gif")} +#header #current a {background-image:url("./setup_images/tab_activeobjectleft.gif");padding:3px 8px 2px;font-weight:bold;color:#867C1D} +#header #inactive {padding:3px 3px 2px 5px;font-weight:bold} +a.deleteDeep:hover +{ +text-decoration:none; +background-color:#9a1818; +color:#fff; +} +a.deleteShallow:hover +{ +text-decoration:none; +background-color:#f3e508; +color:#000; +} +a.deleteCancel:hover +{ +text-decoration:none; +background-color:#bee8b6; +color:#000; +} +.nav +{ +padding-left:80px; +} \ No newline at end of file diff --git a/backend/php/src/setup/setup_images/background_id.gif b/backend/php/src/setup/setup_images/background_id.gif new file mode 100644 index 0000000000000000000000000000000000000000..363cc1cf941e1f10e261a5f8a042b7235cb528e4 GIT binary patch literal 359 zcmV-t0hsM)j$~<` zD3K&+YqCJ0D8eG#c&_h!@BhC;qY+aChK+!7$!t2G(5N)pI1~c1z+iyrdcWYXcuX#v z4atLXpk+_r@Ob=y*eV)ZZc@(g%h3i00u2ZOU4Dp(P(lF;3wwMHl9QB`mY0~BmJbaM z4FU{(3k+L|rc@7o4Qr>ZO%Dft2L`USN|34!wyq0>ege9?r=f@kslukKes{>H0824&&GgWZ4e6TTXW*_5?{% z(6sb1rwpTQ$HX=zPw4QAU09{#;;$=|DyQ2lZC6&eou!7EEC%DL9hp6R_a&#Lwc*!- V81c5q*y#8OxtKUfS*cI}06Ru`O6>pu literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/button_delete.gif b/backend/php/src/setup/setup_images/button_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..31cc30f6968d044cb46c1dc800fdef8b3a2332cf GIT binary patch literal 281 zcmV+!0p|WkNk%w1VK)E{0K@&0WyT9P#=iT4rmzSBQsH(8B zv*P6Gx4FHltF5%Qy58XB!o>jg(4e8Cqok&pnw;k7?cCnu z*000G+;3tk`X`X1Rl3m-ba4dHtEuY?< z0(|cSC66$dBI-;44S~Q}7#@d>ZDcf>tU;MV(nw$~9)v4PrB+Eo(U6!%0Rr%NU|O!T z)poodI|3Lw0)QP9bb5P3hHHt4ClLpNfdhpfXNHMnlq(sMfq?~+ifC1NnwFN9l9GjwkB_jhpvT9x#Kfn!ra`u?fBgLX z%*?3q@$tjMu&1Y(sHmB$s-32$mj3?!hlhfxshg^*pTNMY?(Xi&%B7^FlBK1SuCAt{ zqLGJ(fo*MTbaZdT#Il^6oNH@op`nn_(5%0|seF8ObaZgV#kP=;kgu+8tLrHP4&v$Ley+S<3bs;jG*x3{6SwYA&Z#>vUN&d#>4 zudl?!wUm^GuCABg-^{zav&YAz*x0{uu&|$jfp~&~dCtzNiGEb{r&s)_U`)n_3`oI{QUT2 zWMs+7rQY7YA^8LV00000EC2ui07L*M000R80RIUbNU)&6g9sBUTqqEq!-o(fN}Ncs zqQ#32`Dxt9v7^V2AVZ2AsZpQFlPFWFT*ZvufSSwX4^!R`-b=OSY`pvuM+*T`QKJ+qZD- z_^GhSj~%#p;er9fCvRRpV7~bsoY#Zl!-vrkXtYgLBL}$gJLjJpL#A-XrT)aIB>*<9Bx>RBNtwH4s=rV z9sO)EML$yj5+@A( z#L>*0a>m&~KYQTO&pU#usiq2uCWL{TElWM5& zrxlv2Q7R{d^rOTEDx_LzrSru9D(gJy7_$fjHzbmX5e`%k!6&l@E9|hu7Hh0QhfH7% z63jNsEHMx)bC5RzR4afsF=VUlw%m5xtvU<^AVCdAlxyy}Mlf)QLETv9t^o|in~(_f z(i?#(MC7aQzWLfvfiCsZ`$a!rh;RwP0Vk~R!VCwz!ow?!Gj0tOS8Q>`4&Vau!(Q~` z#R?sJAqN7gnzO>&UA^wSRkB<{N}OaA<~UqCbkIKvDJAP80n0t__Z2QZAG3}vVZITiOrsjpc#AWR;Ef}&g))Lb$2!_E2=Aa{AGiU>KKk*GZ|p)B0Qtss zj9`$2L}U{D!AL!100)qaq$DNz3=J^yl93 ThX~|F&1zcnn%JynKmY(c2}NRL literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/button_toolbar_help.gif b/backend/php/src/setup/setup_images/button_toolbar_help.gif new file mode 100644 index 0000000000000000000000000000000000000000..324f1d43ec470f489e7c205ce8ceea972ba34c16 GIT binary patch literal 1910 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 literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/button_update.gif b/backend/php/src/setup/setup_images/button_update.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ee086f801471333371ca9811893ccfb9caf5109 GIT binary patch literal 273 zcmZ?wbhEHbG-nWCIKsfNW9ROv(`J1A_G9sqWw-7;xOV;ay$4TDoH}#%+@*_`uV1`; z?a`ALCr+Mu`uxq=a~IE^zc^#&?B_4vF%S(Df3kqp>VQa)oeZpf2`YUlne#GMt;>16 zuYiZSA?N&|g2@;3uGt@S3V+qxqxq!wn1}?&5#{`)I@=hUa;61%uq?a8k#a^^zBhUE zO_L0rd8|hte-PEY_-)UPmh0i}%mthrJf&529o6ZzNtv3=%v>BLVTrXp(-XBB`KHwL mm1XyqXJ;)^V{Fy0x6@#3OU>N0dCS&q3)b%3wOdb-!5RSZxNd*| literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/folderclose.gif b/backend/php/src/setup/setup_images/folderclose.gif new file mode 100644 index 0000000000000000000000000000000000000000..112a78412c698ca9ca4758c8796dcd650d4efc32 GIT binary patch literal 62 zcmZ?wbhEHbcDcK`qY literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/folderopen.gif b/backend/php/src/setup/setup_images/folderopen.gif new file mode 100644 index 0000000000000000000000000000000000000000..443dd4ee22802937e94211f21d119a5904fc4260 GIT binary patch literal 61 zcmZ?wbhEHb~6tpo5amj@-skB^1P1DRRQp>F-F_%y*1S`!YFcUM|OoD32%3aga z8EZ19TyZziG)-IFkZ@^GbX2l%373d*eCDZX{^~u?xzD-3_nvd_Usu{EeG9C0-R-g) z03iTCS`I)e1Q3o<#N#ml2*?2cKtMVLC}Kzvfk6Q2$ua?@Jm3-le!n1J1^uFb+aVyh z>@MdQ<9iF~696FxXaQs>hyWl65Q+e$O+fJS!vN@Veid9!ew8fj8?<7s1wa`PDg%K4 zFz5=9g+OIsZ~&B3LMp2uRMq6sW*g1dt=gn(f%xydm9x?}fC3a;z88uB?1A^gJ71Zv zhJL%iEGeleRAX9ST{!M#^!75>F5`EAzqwv;iY6wZ{2or;S0N!6gLMnjEc6Sj!Uff` z{0eqiOuPzNj91yy4J>_snN%5KbqO;o_6$jKjKQig}v7WjSFlJR|)tN z)^NkAD&(rqw!KAF`rVL$<7z0*9r|rWE4|L=nVXpT{ahX8;TBW!*@%Xs8LP?FaCItb zsNVbe$b(ra&^+i>Gk`7pID^#q<8(yDVv?PG$JI5@rj=;1^_oT)|A6Qw3YcQ)|EyFq zr{GQ>g-ATE4vR+xp7n?sSij+yGC0 zzU|Cb$xXm7fu(++cxMX(Cu+a)dDxAOjOSak`zs=S(lp9pdu z!0Qj4+-Q&iyKtwIGgUvwiyiw2eZ*)+aw%ii^V70>_PM=tdegtT#(TrdAN51oxiE|! z&$OpBOkhKw+A@?-h}z=a@T4r~f=&0Zsxv4BkT;4d7sdl?%T&+GjgYmS>`pME7PiJa z=5@Wp7&a-{8r_XV|7=#;At)rL@_gE$cYm@t;VHIk6Iuj&wh#^B9$;j1ui+`{EGm0j zc{t9C$d|cDIx#EijZd3i9S$`eWu~}pbh-IkF)fo$J0MJky%wo0&S68M8eZJ(VX z0?F<1F^#sg2t7aj?IkKH+4~6P57HWy+}6JxGksDyV;#$0KQ)=wcqT{XkTgEutfVpTu4CIn z#?i!=Ga1~L{f{H9wQ$9?ibfjsdvd7sQ?jLGWyue#ho1IqL@M-=IUb4Ar%3GG1zdBa zBS}KNpBss83L784Ez8lmI0@3ms4a=30^AD+mFrgKLQp(qLdqmr5B3LC4;b|_jX4Tk zpc{VL(rBWcy;OLNoq}&gJ3l)Zmu$qsc8VE~om)Qa(J8wYy8Tn3fo(^Q9)i)RV%9j} zAE2&agwNh(d}GhiK1}Oqdi2Aw)`QXR>zK`1Xq(N}5&eOl)xy%tLqGEOIam@(vp%8U%Xd{vwiV}418k0abNV6FkO|Y_ zcR~$!swf8)q7_u}v`B8)iV%%Mxp$lyeOh3sFlu`iuQ*`mTj?^r$(}&#qTqN>v1zzp zVI(r`!hAKXb924NqF&yTvBb0agT$wVm18QY7krxG&D37LB?TTD%nUAk&KzrGs@4AQ LpIq6(rQE*(Y^%V- literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/gradient_container.gif b/backend/php/src/setup/setup_images/gradient_container.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6430f8b7f536bd1a256f6d6ad340a6336299bf0 GIT binary patch literal 179 zcmV;k08IZ!Nk%w1VF&N#Ib=yL zXo>=C>%MU8K6Gv0c-`#$j{Lx&5D_REkI2Aa$!t2G(57HYty-_xDr3vt629Q?VN5QY h&*X%9tv0yd@VG%iuhT{NynfH``~QG}f`cFt06P#>X@~#- literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/loading.gif b/backend/php/src/setup/setup_images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..bf510daca026ca666c43682a7265f8bb8d7ea018 GIT binary patch literal 1141 zcmb`_XHQ#a6u|N8J;2z6kg&moOcUZjN7A%3X#yl^o2E_Z0NRq4M@W1CBm^(u9^dP0 zN8k`fDHZ~&Rcyz_27?(k!h$jc2noazOMpP^y{9Pd%Zj|~`2fH3m(GcL6nX3R3jrp; zrV-ZH*JrU<^78VMlanP9Npy7d(b3V~-rmH-#KFPA>gwvy(9qo6+~VTm%*@R0?(XL1 zre3el$;s*O@2{<`Ei5c-Yip~isYy*ujf;!h*w|QES?TEL7#kZ43ky3uJS-?E*xufr zpPz4SZQbABUszaJT3RYDF4kx?6%`c}Mb*{Sm6es5Os1`^t(~2n`1ttr^mL=qI6FHV z8ynlu(4bbUo0^(zHk(u`wOXx3MMa&Rod$!Uxw+YFHYX$`^z`%$3=CvsWR#Yc#>B+n zIKI5RoS2xHpP%2@*f>5uzP7d&9v-e#Dn~{}T3T94N=l}ur$3UX*Vij6D<>x> z)6&vNlI-p6wcG7oU0wC{^(iSS!^6XagM&#)N$u_J)z#JA-QCB>$JqZm;$x>L5zn99 zzxOmEG(^gvo#5grkiml*s$xfb5KXz1OCp3i!oU4%G-aa?7lx(M8F-|Ui&zGkz$)*26*JOS0 z9t50KU=ObgSxDgV7kn9jn=3qo@Z_Qu1YhLZaQVB-Wdw;w$z@`0kP-!AF8-=-1Z)+_ zR5J-$G3|Hq`u7lgj(GM%EQf*k?mD>p05_W4IdH|h3iu*2Se`cz(x+rxBh16Cx$J1{rv8HM$%`LWNnDf!+BB D{O-KY literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/mini_pog.jpg b/backend/php/src/setup/setup_images/mini_pog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3cbf683a1551c4d807168e8c99f0faf32050d76d GIT binary patch literal 16299 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 GZ2zBE$N9Vf literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/pog_setup_open.jpg b/backend/php/src/setup/setup_images/pog_setup_open.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4417e8c164fbeb41751c96071cb4be303f199787 GIT binary patch literal 2398 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 RKHMI$b7h?T6Y2b+e*m%gn_U0^ literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_attachtables.jpg b/backend/php/src/setup/setup_images/setup_attachtables.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ffeafad32c96b5792495782c883e5d4c2f42359 GIT binary patch literal 2106 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 literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_bottom3tile.jpg b/backend/php/src/setup/setup_images/setup_bottom3tile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..abbe75d3dfb22c240ec33927c5b3a21a928b3a10 GIT binary patch literal 311 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 IFI5fx1$42%IsgCw literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_expandall.jpg b/backend/php/src/setup/setup_images/setup_expandall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52751dd594d66f1e2b92f268c662c8af205784df GIT binary patch literal 1974 zcmb_XdpOi-8~**~HwR_-$R|y5HfUXDS=OOlr&@}}_^9MC-)P(2Z~y=9_qv|AOswNMk3KN7&Jyk7AJwM?5Cp77xs7d_r5=w zxD6mk0s8@82qXY70tgX6aTjn+VjBWrki_R7Kp;^d9FjtV5(SimzX0x9M&bbg0f8_q zghKo-eM$oaq?`hZD3I4IEaxa{`!IYR_63^;k*M{1q#hn=aMF={D%k;skgWcBA_ybM zLBxEjr-G?N&_nnwf&5BZyC#W+5KjPD2$YzF2!I{1S=P|G;b)s>YcTt7b;Ww4>hYPa z`(^fJiblQN5f{rtvsRmuVM*S*no90X_5SfSw1_&DZst9u5e>yjEY8!TRhvnkEAhHh-Dwj)u7eXKYqSs3mCQJ4uJ74q zriI>p`*id(_d2i?BJ3E^^rC_&!$-R3hf)rQZe(HylE&TdslAC#i2v%f3%R%F#%Ys$ zJXFE`qRI3ubaIAYc`)7Cb|CSw+LC3k@~ERShn^9$-a?XDrC9)rT0foj(wfPqakWSW zhRG@(8t1kg&q3r|uaWV#` zYjjzIHD%=}%v7nV8e5Qh`HZ8lCA4L_2U!L-+zxO*aPAjZMYmPMUkD|92Ki?%_YMZo z-d92arVpg09;p&NH5Ua}eO>ZmH z{qU?cN9DsJdHak^bj-L->EO}|EiA4#MPE}|5GVA(kJePV!+XtBVYB9W{yAphBOErX zfxL%#xLJMPr?4BVp2)NSwnO~uH`FH;7q;i#8y%ODDSusiKAWVk>MOD6XVYm)Yj7MO zw+0!m&!jOX`PLWabEkCTD>oXuSFYRZ5&IQzP(ZE8M|_6D$wW;{nEsAshVi6)Z(N0M z_`Fi|@GLQuS>ZH{oYrJ`>9JBzIZtayU6DQ5Fi7Rh%v2upx-&L)jfU(* zv_)l+!m6xErQbaiaFL{}<4SpX(brw2@P>{jJcuP!*W9*kdMI2BkULf9EAET5Z`QisdP2$TQ4SGh(^sek z!mF%7x2_q7>wNypBET&4in&6YW7v;o_QtEqweW`t6pQPKyN16KyPFfA#*8hH0~q`#oOUUb zM#m;1-S5!pWzyY!R7_kBY~VH(+SVd+WbCP_fJ|3Y^XRFmkDJMv)mM{SE|cAKU3s}o z7Vj$BXM|X$!+in=>#BX^6TLVHjUTo3(vI2=sbsFwdD}LvT@!)RnzWEQL7nHFd|nb6 z&g_Fp|BI?sd?FL{al%>PFvT6_occpw)}J}oA_mq7>36r!3s)O!!;Wp1@6^A~X6%@( zk7NneYadX{c^6u|6_;+S{o_DZG|KAYkRYYR9P_mgf((Px^)AVX zUUK$Qn3Y~}R&ZmXO0!w)=3v-z|7zILb~EXdwcb>n@>TjYcz{VTZ9W=-fW0Z3AK1Up zf-k~Y(0>|qVgKN8kQ0la^=#&rvaMNtOnmdT-#n&?ZNzG0CCq4iJxy!kKKe}8tmP3N zHBw;sxcf=Mx5HXz*>E`xy&bzCPtwJyC|G9dOcddRj2KXi9eAamkf1#$7`x?nya9XK zsz)EpD`_vqYHF24qKICKhvXK=xHSfdrw<|>{YzMZmd2F@hA-yUM`NMgrE#Ky%k-+SZ`tGQt1Dt4s_UD2uf~DyrEY$FO7pBWO@Fs5c;4pI49+r1bl#Mu zrvBC{Z?DVP6cE_?EtW#8(t zQ%|76b$dQncnD1w4ksrkJU?{B;mrbSmjJI0qaJWod%5dtQ1O~tYihJw`q&UIWGL|? P_&iZI(EhJdP(1!$;U+S{ literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_footer.jpg b/backend/php/src/setup/setup_images/setup_footer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b57b2408d1d0105440dc6db95bd7bcf955eabb0 GIT binary patch literal 1145 zcmex=fiY(89pR!otGJ!p6$V#>oc6+#GCd9Nauy zT-;n-JOVsmAi%@NFTl^oBP=W;A}lN;EiEl04+o6w?CiWeyb=Ne5>ldqqEc`PVj2Gr zF$i)nC^Kj?GYT>=2{JMZGX6ipuo>uXRz^mk^WlJ*g_Vt+i4iEsj4Hv%#LUVfz`)4D z$il=7*TMw!IE#RSfgr1)kdcTgn;VR08NyMMD8cg}}tZ#)%&m9=vF<@#Ftn3_L*FnFN^yfo{Lb z;J033?E!(C=k2_$C&wyfUkzCH-14}!_kHp7zkhW9@*Gl{f-E@MW5_7Ot4AvOf4#2k%!`ExlF7ij@y<-s@~(Se~zVe11qEGwZtbVT=8n z1OGF4wI7cD_}Cv35Fo2A@Lbr#$(=SYlPxnpyOpabEZc0Y=}ujS=+?y$Rm>n&*DSca zM3jS_Tdm?B0QDkbQ((eOrR^t|F)10${0<2$Mxc6uOD;08Z@s@4~=_Oc(-Pu&FQ}-Zv$PJH=BR-m!5dt z*5ux60=1um#fDd4`>eAKhcG`DEs0@l@fOugHd K+W5`?e-i*a(Qn8A literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_generateform.jpg b/backend/php/src/setup/setup_images/setup_generateform.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1da87334fde2e7631bb3ae94ef8f4cb1902a5cbf GIT binary patch literal 2535 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 LR{Fxb<=6iO|IG$# literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_logo1.jpg b/backend/php/src/setup/setup_images/setup_logo1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65305707889b4181836998277f3ed334b58c76cf GIT binary patch literal 7992 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 J=JoMnG^)#h%`t5{-a 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 literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_logo3.jpg b/backend/php/src/setup/setup_images/setup_logo3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d97149b82ae90eee1fa736cfd1924896f75d8b0 GIT binary patch literal 6683 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 aebkhL6Ewcw{@ZNu%0FC)5EIj#Vg3V*Z#3%w literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_pogmeup.gif b/backend/php/src/setup/setup_images/setup_pogmeup.gif new file mode 100644 index 0000000000000000000000000000000000000000..ab95cb7852546571aacdcfca3848cd75e7be074a GIT binary patch literal 1420 zcmV;71#|jGNk%w1VF&?00J8u9_4fJa>F&$S(6_Ev)X$u$s;oh!59sE~r|X5^;pOY> z@YdMe@bUHY^5nk0!Nl^dA^8LV00000EC2ui00;p<000F4Fvv-(y*TU5yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ$!t2G(5Q4uty-_xtai)odcWXGVoWZZ z&*-#z&2GEj@c1~qBQNgwynfH``~QG}f`f#GWOO!m3j&Odj*pO$l9QB`mY0~Bns}45rl+W>s;jK6uCK7MvataP0-U3sF9~=Gv%kQ>!o$R<3V6A?ET9X;&d<=% zzqrcFiwx4)+S|?yx5?Efpb6aN=I5=vbK&BPzUc7r+zQ|9?E>=o`p@1A;PxVT;oC>B z;H-K8NeDE^u;D6%2?H*2ND&%?i`alcj0j?(w2Q3&K(4}A5tYc03g%=y=#Qhsfxr&P zl-a=4N|^)>*fiDPK+Xm=0Vp`humORfLy4M9V8FnF04rl{blJhL2Tj#<{6e$rBxSI7aI)SLh)XFcg6ShwtQ)+l@J z@;9Rh6t>uCdyO*CwJf6T!R68RrrIb^I?7_H%+=Hw0J1vuzg3^YT-%QT%?sCHH^Md6 zT5lu}BVZ@axYn&cu5~I5w5;dgNPal;;FgBm&{P%nH)#9KI@AZEbErr4Ov+lebiX=jrag=CAPa^xoj*A^8LV00000EC2ui0B8bD000F4kjY7_y*TU5yZ>M)j$~<` zXsWJk>%MR-&vb3yc&_h!@BhG{a7Zi~kI1BQ$!t2G(5Q4uty-_xtai)odcWYXcuX#v z&*-#z&2Fmz@VIs;jK4oSCq(mywXQkcqg4y1Ib9e|o@rbi>1L#xe)V%FE2n&dd%D z2hr5k*4NnC+SLQy-rwNi;^XAy=I7|?>g(+7-rMl;^4HJx_Rh!o`uqI-{{H|23LHqV zpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m$`$B!WYLy8 zoJq5$&6_xL>fFh*r_Y~2g9;rgvp@j=M3X9Q1E9cw0!yPxE#tJo(WzLoW@$R0fmN+w z!zwXKmTXr82Cj--%eDtsacI#(ZA-UqjjCR~#x;UON zx9{J;g9{%{ytwh>$dfBy&b+zv=g^}|Z!X}|f)@({2$;^jU;qN(!C!A7fIxum=m7%w z9^e6c7v;~VpU;o|dh_fF06-8P>38!AJP_XW0sxc;o`2y5fE0ZUx^Z841XKrJd*Jc6 z34RfNXQ2ZXnzz7&<~1l{8~@p-Ap`Lp03rg32neBz;l&r7|%vs_CYjcIxRqwtXt<61$CRY7qmRswxo!gu3dhJRHysthDOzPOZ4o5KgYV Rx-gEby#_mitlmTb06Y0!v%dfU literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_recheck.jpg b/backend/php/src/setup/setup_images/setup_recheck.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b0bcb70aaa6c70c7a4c25513b1583767d1f45fa GIT binary patch literal 4074 zcmeHKdr;F?7QT6c5P@G30R;_tfWjJSfHFumF%W?SDw06jBHa`kc}RmoH(Q}X&|*QB z5J*B0q*a7iU_^!*5LCdfSiq=I2#EM#3y8G1iey28kZg)$|L*L}I_|9J&OP_c_nmvr zy=Tt-t5 z7L@^k_FmrSAs9fI0|K~NzYGaQz;Rd@5kWiLm`XB@01U#+LI?;jz@jJ|HyK}L9O6+< z$%tzme&pTSnyIT({ygJ!f7fBM4}QhSF6iUsUfD19hkG-35nye)Da)HEzeDKfyi;#o z-qz(cG{d)Hvo|UdA*xOU&L`)E>Toy>PO--@s@)=a66Q>pyOw5KEoo0xfDr zlm#7{Zsij$m1l4@W_dYG?4NX9&)=jkq?bHY7<=c1%WcEY;zLOD^+B;#ybn1Xw!5fC z8NJxGm2T#uOvY0*P?f%TBwN_$9tVenmx3s2gAC}8H+i{8LE+AAEEE^E- zjeaTFa3k@-yMxsuNrtGQ<4-iX-}v@N4h5e*-J{fg*p6H$SY_N{H6uTx=dFb>Ezq z*DoOLxHfLodmHCGuhx5{w&t#n=o`;bzEeQ@_<*7=^ftG^1dx&&^d%FxQ8bl_C*?O+FlxQ0y5!_FB^w6~?xobhTal9f@=IIvs3p>>?6C3iCduMfj z{FrL&qtBXl-w|q+dEaB9(s^ilvWcc2+itI}(o+3o?&N6`m`7hu7B%Z<6L5OI(7?@9 zNkwN>p_F7Oi>p`;`Ky7psfnKO>jPpd{nKleTe^ADu5|Z(%(eKV<=QA~Z(TrvRM4~) zFOd~VGnX>4mj_H>PZ{kIK~28?_t+HQkrSDk2AilR%$)pg`59rxccm_6b9$p?yIZhM zc(D3r^qzno`M#Kpv>2bdtYH2f7hQatnD9e&;Sb_pKZ%KG|9YB6#7U{x!b|9#n{?vq zs;JAmk|`?oV0Y6YBm9e{W9@X$!Hwyz738GPNi73ECWcOt{Ca%tMBiTAU0toH$!O(O zgm;Mbk0!)XRA)6um2)&SfOT+-Bv!zfZ8L$vKtjXQ@fRkzwJoIjSYtxc*h2v`acdlqv%eg1{FQ1Ef#va@-}x+ z(hG89j88l00Rfo_d{$`^F3HPFq^w8A2P>r+(|_rWG={WWd-nDe3zO$R=q4(l#EEnK z@S&4}<7uC#-4m(lt;mr*L9KqxiRJQ#0n4HDg`pJT3yeOs%f1wdoEK+kQ?9YCxJ)2?zW3qWwxa^8} ziD~V$n4`R!di4DR_YRDyIc{>5PUm}5qtW0-Ta=vZk{16Zxupq&XUd=b5_YY42Z<9C zNUa=T`=?BV=1ey3)z+n_mE;g4`)32bxJ_@C*-m_`%v~LlYAw>7NaV;%T6fP?xYlxR z&aeXCTUN~EhURI~cu*pm)aMv?IVp*iV19hLU*^*)B!tn?xvcYX)OCR?G-l^1b8%_* z*>P0R84b(RAl_8CpxR5(T^mNxJLLo(YGTz6JTErnI5)ArVWbm|GqsWI|0+;MexCXo z)4iTcz0LBUb`Gang_*@SWAwP+TJR!j;dt`4Ge@+GwlxzM2AIQt%HHm?{zwbrt@(!4 ZA&O4IhP%6bZ_IYfe)$c21GVYSzX3dKkF)>) literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_regenerate.jpg b/backend/php/src/setup/setup_images/setup_regenerate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..878d6bc4e77ddfddac91edadef74acc9647f448f GIT binary patch literal 2167 zcmb7>dpOf?AIHD*-DYzb!z5DA456r*Gg-vsFga|=AwAe689yBqDiVgrp~)%aTyjXE zNlFqqRB{-lIg}91p+u{&Jp1)@{jTTt$MeVYy07cLKcDyg{#>8Weccry7+V6Nc00E!?05}PyMF3?%3-P4`w8ugPvM~b00wR9_3L_9I+(9S| z`X?|r>=$sjs3<~I6ploSi6M~^e+L4BAPfpa!r@3saiqAU6iSGc)GyQTL*hT#-|PO$ zHXZ|L1h4~e0U>BW1PuYvkd1brSU5HafDnjq(BHt|q9PyyiWF)>{l6{%2nZE{!KDER z6aYa40)&eHDiIOtFaQmgkrl<_aiwxp`a$P@72PWt7&QxDgb&MwP~2)6<9bO?-hgBy z>FJy6GO`>9+5Zt9R~g z9V(GkE+}l8SceM^d8P&SBU5`1jQ#Nwyil#($qtC^JX*fk7zJrLC_l-)Yw1_d`Q}B8 zep@9Ty5NB&r1G*KU{5ll)Ek zKFW%;%5>NOAl|_awKuArY)_^QCgh>63#`Vk>$4>etFyTuX=8)L%@6SE*i5>|aDE3p zj5c0ru)joX*nfXT?g=dp*=$ntoEMUiIQq}`xTdXrS~W+NyQrV1Rk^0x@k8u~3FVr@ z-NVVz-?IS_Vtb`pui}aC;V>Y$rFiStgiBIWpN1_0U10O)y4SKeFmJ7}c{f*|}W#Gp|Kv z&78(1rqkIyDQ=jn#7(y+hg?7M3ppu)nT<^f+6PZ_gby5RU5sDf&yce6sY==-=63f!xE3Hxj{JLLBH4J$vX`Cq4jLo+7 z*W>M^F>c1|G)BItljHU-VH~J&uXu50J`3$x;jKH*8ahXMQlzymS$ls>>}5w(b4?Jg z^CKxLgzBp4Cd*Ud>6Hl`rmp%8>j^!vwIniSjB%c-Q-<#JGDp<~+UaSjT^_>W(rLEpcxyGo`5&>L-!L z;yDLvE~e}}FL2%e-B$fubk_m`yU>_l#!S_DHZ)q!DU_j|H&a$vt?6|NO;!sU4xH5L zEHXyq99o(yFo?E(syD6~ZBXW}mc>r)5#)>p}$45grK?Gge`g+S1CArRDDbakmJDpVJ$5HG*mxLZ$`OfEXU&X}p> zRh4$;OerZw2AshVAVudqGm$-$v`NyWhR@5Sgn);Q^(arJGhyOz}LBfwN$iJW@PW!9ZYR8wq;<0kg}%(`aM$?3IBFPV#Hg@5uCulh3V z$jYwueYH_h{b}14sDja?Kc#p!JZ z3V)^w_oeRrNG<))CMB!$x^xqkzX9L}&kg&$r*l_)r_A4eFiFdkFmrg|o$SRNS?_dS z_F*PwAMgLy<+Z3Bo_WyjCEbMx{E2NL%gQ!A@mtjo-zMoCw)x*iqu@ESHs{6ps47$l x3D@?VJ=@)Udi(qt(=WZV`E%<%eBlG`=&}T&(OuI=H%w(=K}(Mey}1a#RK7?>VxzCA7T*XV9;jZ zVP+I$U=n0x7G(T?gkc5)BO?Pd(Deww%FM#S2ohyPhylF>a;^Z-lPoBz1%-qK7!{cn z43q_dCUGL`U|>|3xR7ZQv$3;@5Q+2z!;cVI8nhsapS@Nw?OU$ zI+IxtX!W~V6ZhvQT%RwpX?8X^|N6B&P#Wk&21ZtJVYAO>*=40~F>4n!0Ce}lY1PQ$;ybk0boG&nerSq>o+%N&B zR;4rDhFg2rq*hDD9qX==(tVi=mIWCoaNKjoOFM;6a<12w#b#y0O%-^N>K0o6|0V#t C;e_4* literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_updateall.jpg b/backend/php/src/setup/setup_images/setup_updateall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b8be2478e41afc3a566fd9ead060a1133518f07 GIT binary patch literal 2340 zcmcIic{tST9{Be4pnPa0KrFNgGRRO8^80 z08ilo1PcJ#JjBEA8UO;I001}$LrVbagl7QN3-D|fMnD2C5DkF;0z~LRph63Q!k~Wu z28VqI9F9PUAP{gQQdAU)6#F|s5C{YYg(2Z^r1&=EHgO4*5E2sKi~eKN@pnt?b@^(pFq!UnM1Zx1%`PCQQIn`fo`6-Ei+!l>Suv-!<@w!x~3O(H8Eusf(CE49mK9K^=_WUg^{ z+cWz0=F-Ma`qw&K_N@cSS?n7NOq@%Xfihw7O3xW{I!XR`NSlcLb0cj@e>d7ine9=< z(Jl8*!Te+>EAc^_{D8Oa!7l_rZ$s;E_E)}^jNKRxahmgIQgcdq6TW97XAq!5y}g9J zuE`kVr}T*sz1|2BFO6-a5TChExw5{DIum-{@Ud5(;ki~9x-Acj5?Rq&%Bs($E`}wk z&Dh9sG27p-2Mw`R|6DsC~cO^o@>#F|Bg!oaL(HI!m~ zL0nx624mDTn6N_aNt^!EeS74q?l2+5GOC}nIx9cw98%V(>X8WbxW=;W4}5TOT$13# zcCf}9bGojEd;3(I&&?-nt-LK$G+{KoMOEGsn>DT19&|1FmG4$ds(9(yHGSRbLv#!F z(yKLY#n3DI{3(o?Zw9mootdI8w?%XwYCg19HXeD{?qkQu<{W>ApA-UBk4mZ!uz3;~ zO1QwedhtO(J=cE!*jWx6rC8S>*Vc~5qS3_Dy;jD3+)-XA_OkKvLVS0gYiHSlU+oJf z(b@jEgKyo$C6}e%9P}YfL`)@z`9Q0N+rX^Z_2%BwtKyae`I_W6Ipj?9nON)oeb${- z=GL|gKM!HgMKks{Er?Zjs0)BO{YThK>fdtbud{KEN^=f4YO4S^=PSxH*@i9(xEmqc zBlbAkHj3elZMW>RfE8T9ORj6oWOdiyAg2ao^qi4S#AP%5ic|)U|Kp4SXZTqF;JyOJ z7xa+uO2v3Fal`KV(j@_)k-1vNHo9Tx)>Zvv*k!J0SJq3YEjePNBeOctCZ;=i+Ny(X8Io%xg=Y2e%{;IUBDvor_715Hh zKrM1J7W;7Qwnhm+W4_M)sLrHc%kn6seb9AH_&_rf3FO$>mo*@)eOj*DCJpA{yDCcj z=}_6gb%?$R=rhkJ>CSN#GoSc7CHG2`m9#WtI_Ekf&QCzwr7Z&RwdpUma&;)dT0E9j zSntsNTl$&DNl^;g(%sxC)H?D2>ZX*c0o(tYS4kN%PDl71jyhROY$pBIVQ@R-AM09-%{3k5fDRSG%YS{~ z#u>Swdxfe_rXiPY654|F+Y!{-k}STY@ze3fjlHz~w3K)@jC|&xZ9~rNqv!5l3ibG- zi9Sn@nmzH;%Th?qr2(um<(j7M`DOL=ir(t9k0WapkAJlg_sc)avRU(}_b!`vQDBt?5mpCnK!W<*+DPRl=WRNlQz zecZ&Q;ToM<%G^;wqhMd{^jw(-=SU1U)%?iOos(8!v%zA;gc3T59LYK`W2eqwzRZ4I zihDt)ptSVEv+d-Ro02LEGknXl^-m5W!-rH2rcU2?H%v1~PHsu|zTH7c?KW`LQ^BGo zEo>L=#%-4`4<(Wx4cxC%bH#Pdn@-A1S^vbpxe&7Fh|J>Dx&Bp8r&z84@L+6Iwy_$E zX4+5f8|b@iYvqve&4}YZHPOFHEex29;cM9U!1uMk_@kiD26;UMYbF44D%<{yaK8uu z&b-M*o!wZTma5vxMFCJX7$IyI&ZicdO!5`1*mwT7oYm#0YkN%hocC7f$lF*4jfYD- LjQX!#h+y=0*hm@p literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/setup_welcome.jpg b/backend/php/src/setup/setup_images/setup_welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59a03e44c4033c54505b7f05d8ec8e3437ceace6 GIT binary patch literal 3849 zcmds33pkY98ead5%Z$q~$V_u8jZ3N>GDxa1DVI{Noj3@Qz1_AXCd4*JDZ86?<#IML zNiGq#2OX3MC4{DN$)!OP6AdzkgUrnN(dnsu?9S7E&hwn-?C*R3?_cX%-}ioN{r~#c z^NU`H`hmQq`CfAXApr1#6^OV1Yf3%h9}XZO1^^(zt}#F~@e1_(7I;;|9ta8Kkw^(N z0OBkFq%;7KlN9xU7=V&k5ZIz*P?9Jaj1&qbg^`z)#mLIaV`X5Ak-^F-C@Lu`$l>t> z0v@lXs;a7{`B5M=3Wb(JOQX@!7-?B)3>E_mR&kL)5s#IF1&de4DJd!8lo!$o1R`-Q zk@zuRQ&a=6D4>JzMMA0ofrXG*NK^+}0JJ3V+?PZQh$A4RUTiGcl(+E}2j{oAT}dQ%F{xzRdf6SdaUSzG1i zt1!}UM=y?Ot@JeFCnbN0R);aMYqt2Zj@boz0Y^)v#X#?wloOWssARIN&Do;w&>PcI zoWd9MVL#JoRC?o=6dF3?Bm(3;PfOT_se4-3_9OxGV%x@3jbGHJ_jLFPq2S#Ni9@-c zNSZc@9bb0vGqD#)rPDECjfW;uv`N`pr#E!f<2&OhyPJn5!|$^K4O2cgT9fEH#%_`K zXTy1uga0<#yjT)`d*YBliYDi#?DTD7@SMSCwSLucTugy?nmEMK4j+13Q1QEvv{k6v z!nD#~4y}QBcKb9xw8EHmIm5WHIIl{3yHPgdAJoXM$u0rMbcAmc&pO9gHWzm8NZ6}> zbs4N%$^84^ID24pHlpNxIhQf3I~R5TebulCWWSsi7*Rv{!Tcj#^-R8C2US3~rmgGi z$?usG^cs)nxfBnLk2Q^qa1%+(5X04U>XuswJefp?Q8s6qQ-5z$F?(#}EtfqMI?&n0 zKM};7Ix#x+ik*e`Xl?G|4YqgEEsm}xmxqS^P?Sh8={vdHrL?yJDbEyR&Y z?8_-}tLEpAb2#ioGB$WJsMT1xV<5klPLKP`{QTi8%daENIvRDdG`ab^Vy8PD{s#ZO zhPTT0rr4zq0U<$ws?G0|t<&-S@%k00-+WgMhK%+L>ESJ~2iZe6(%3a{TAF8M21bE?jF~9bv;1x~|%?U){g8Iq%7K>I6l+ZtLu2wZ8P= zD8|_Ax{1r6V}4EqLc)G9w00b3iNH^?DvaRbcHH*U7Zq9Kp~Ht-y*01Z*RlFLsrKPTNZa$$qFzQKf^9Yo@<%0~ z2H#~`3H{w)V^RwH$koNx7CTD!pzJsTC1S8$-3Q@NQRzfMBxi zlH5HnX2Xb628GxEtenNc3K&zg3ic5+M$$dUS7_Y+o^I39L09Ibb^5WAr>5Vewc3ry z>=w6dH*f2~sT-#~u+R(s{6@gB7PxgTK?Ew*R3VN;4 zEo+?;;i&Qr*%8lvh3zo}ZivPwre3=WY1>WJsI;D0=iYCs6PDb4G2gg*(po z#?GkSMJ_A83Wa`|KF$@o_BpPEQtl~cscp`w^bo%n`RBh5cg_wbbguYgndC|DlOyhp3Jj2!Th>(8qX{Sqw28d4`pN+owaNsR0o6b2C(C=HQPNTKa z-;6~$+zblIaD*c5bu%z6|1D55(7)6)-(pim4bN$>>rSR~(+k@h9=_S3w$NIf2 zACjiRG3OKtaYI5C%BJy>Ou#H|+{7@tsv|pop6llm>YMZPi@x4USJRf5 zLz1Ibj-sERQL-~z2Bg?Ilfq_xiB*Qf1MyY!M~%v@<_MH7!VK++%IVqIn-gZ3n7wvY z`X$UJkNlEdNw1;7Z%(F=+uvr8geP=c^RGUVHY6X;$64^_1>o`G|a3 zlWV@GrefOlt%Nb%!v^PiEE8$4(M)x$|D%#T;tr2W;Vfyz06Unum{00$t{X5EhoKw?A_ghUOka_sH WgQUj)r!nggfgaj0*L#{K>iQ=~Zo+8* literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/tab_activeobjectleft.gif b/backend/php/src/setup/setup_images/tab_activeobjectleft.gif new file mode 100644 index 0000000000000000000000000000000000000000..c80504a30f115925e976e5e610e829c7f134cfe7 GIT binary patch literal 145 zcmV;C0B-+BNk%w1VF>`10J8u9>FLk^|Nrsv;q2_z@bKRK{rl|f)%yDL{{H^!>(lG& z((v%#{r&v@{{8#=_xk$vA^8LV00000EC2ui00{t=000C&Fi81C0+SKIad1Y*A;lna z&2nFLk^|NrXh(CX^Z{r&v$@!;(2)$Hun^z`WW_wM)i z@ALEJ|Ns8(?%DPA>htsDA^8LV00000EC2ui0FVKe000F45XecZy*TU5yZ>M)j$~<` zXsWJYLj-WZ&U9_xc&_ifJvgzRa7Zi~kI1BE0aH4k(5Q4eRLH2s;jK6uCK7Mva__cwzs&sy1Tr+zQ4f1!o$SH#>dFX%FE2n&d<=% z($mz{*4NnC+S}aS-rwNi;^XAy=I7|?>g(+7?(gvN^7Hid_V@Vt`uqI-{{H|23LHqV zpuvL(6DnNDu%W|;5F<*QNU@^Dix@L%+{m$`$B!V2Ly8 zoJq5$&6_xL>fFh*r_Y~2g9;r=w5ZXeNRujE%CxD|r%fO6_0N*eN{&smIcng}sSqy+djKvCL TDi2^F==0c#00azRL;wIg;87mj literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/tab_diagnosticresults.gif b/backend/php/src/setup/setup_images/tab_diagnosticresults.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0e9a5b72dec5dcdac9fe709b351ea4fd12050ff GIT binary patch literal 368 zcmV-$0gwJiNk%w1VTk|~0J8u9`}_O%_xI%G=<4k5^Yr)k`1-A}y5QpG^z`)g_4WAp z`0VZO^7HlK*`A^8LV00000EC2ui0Eqw;000F4@I42B3Lz!LyZ>M)j$~<` zD5_yf(+u6Kb(VElbz~$J-<-y|G&E3Dl@ZsU}TIaRwHgE|YAJS6v%#}%zBy*iyi3K9dmnU7q OoGD2r&6|lL0029*#mYti literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/tab_diagnosticresults_on.gif b/backend/php/src/setup/setup_images/tab_diagnosticresults_on.gif new file mode 100644 index 0000000000000000000000000000000000000000..e2b8002e6abeb3a3fe75a8235f15002248530d8d GIT binary patch literal 371 zcmV-(0gV1fNk%w1VT%A20J8u9@bdP9dJw|K&Dh%B>gww3?Cksd`{(KI$;{IB_V)4d z@$d2V!^h6$=VA^8LV00000EC2ui0E++>000F4(3qskKqBkSyZ>M)j$~eq|dcR6gM>MTcu)%h1qA{^iinAelsl7Ajs%fG zhk=TpfQzG+qk@0{rJcVz{13~lZVB$ILNcInaRVp z(n7nvp1;zi*|o;C+S}8&$fC}t$K2n#yq$m0;F;&e?%kNdqCLv=;rl$*>_6#PwQ>cI zpetbpX)zmDj$A%*2h~}t!|am9A^zy(y2z2*x{e?qL+Z#VvLr~7CR1KQsj?-VT^U@; RoRi_efjJLmsyZ>M)j$~<` zUUn(e@<>%O2uE$-c&_h!@BhG{PcTTZTos06&?q>c(5Q4uty-_xtoGU%I2cC-LqOP? z&*-#zOAvqo2}gNNuiNiZf+GPK4Df(~f?9qG0!@R7ih~UT0SAkbQU(T+W(SXHl~9|O zRg{yRSfF9rl@C>m9|c{o4TF4PrSLfp`^g8#KOj)z`ke)2()Im z(oxF0vDLxG*__te-q_l&$Fk3w;nuk0$>7z@zuoHX>DTD5TF%g0qU_V>+2i)!{p;qB z8#Q`q@R<|1uHP|X#fouzsET5}cM{JiY?URT8jq40Hgcrm&JM_sF)9I z@$d2V!^h6$=VA^8LV00000EC2ui0D%A&000F4kVtZrGG^$_yZ>M)j$~VWD8}`~O*c3J48=hKGg?2nGU7h>uSJ0gze?0*q*rk(5@F zQJz_#bOHkcnVJBioKmW%cBH0fl9RJdvzoW4w@$gXwV%Jesi3>Qp1s9pu$jZnk+is| zzRt(dP{h#F&DhSo)@sYL+tIb$!{yew($v}P=jhkuty$q_($&-4`swS>`QP~b3G{}h zUYUFH+F=V;OxUx9q9Dri=1^IwRiXN+na9Z>MqnHu(}bkt@uSI)B~Pk^lyap@Kr>#- RL?j?Vf}3#PIKsg2_wV0-|Nedb`t`?;A3uNo{PpYC@87@w{Q2|g^Ve_RzJ34x z{q>u7Z{EIp`1skYH}C%c|Nr>uizm-se*W_9$m)J_G+FkF0WXvD+P-I01S$7=qC z6(wG4qt-{HrzlEDG&QmxIFVr?Fk?&A*}UENKkTUSTYvi|hkNrwUOPT!9s!~9*0%PJ z&Nd-|8g?aCCSH-Qsne#Y!_h+9tAhGXk=DxBEyT#@*9G!OQ%&7yHF5Em_d}W^Kv95FHZrwcl z>cz{uZ?oRt`uyef{`YTRPZbk={Iv5s)24~;`tuG{vhdmoYpho^YM=2#kimgZ`cV6? zSBW<57w?+)bDMUlywFWn>J<6!sdy{Q=*fvbf$H4d5=Lo~P0c=F7pFtYM+SqL25u<&rZfU?&dkBy6tc1y@xX&i89WMp9H;Neh6 zc)-leDitDeaMRM$(+!eO&GFp4?Cfld?68c00|%HVGIH4L*pTSR#4q5b5qoOO%FD|G z7JJS0+PdoM3IQ9Hhz$=9oo8U@$v9!~aMjJt8JAb>wNh+mV`gV#(AaR`(5>ASpI_Bx zB|0)Pu<)38Y}mfx;o&f0lZMp{&g@4fC_BGvaCBs0Q=a5?@6Hq!&U0akJqZd64|Hsq zKXVz|-Yc84m(E*%tk34r`sT|S>C-Qqttx+YV^6iS>_dhIjyvh``@gNdUHbXynRM%N zt-r<}?%$Z2UN3j&6^G!liL)1O_1kA$c4PI$-(m50ZGL}xeS3TVe7U#Z1&#+^cHdvK zulUDx-{rF!uJ28MQ1!(z{aWqMr)COG{}?qCoBUbBAJj>lTRyK=>4EyZ9DcWQxfYgb zD->F#{~f>I`e|;3XtO+*cxZX+#R`cYBQMnliPm{-$$bt?Ka(f8Y%)uk=yBG2Nk%w1VG#fn0J8u9|NsB}{r&v>{Qmy_`T6gx3L^!4@i`uh6&`}^|p z^7i)j?d|RO`1tSd@9XR9A^8LV00000EC2ui01*Hb000C>aDYjx1wr0DlHS%pWMDN6 zhgVWVpp5G@2u>5kK*uZs9w3ZEFZO!~eTc%5m^2Jm0Ybs)lTwM+XDK?>g1A>`w%R3! Iw}c1)JEM3}1ONa4 literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/tab_setup.gif b/backend/php/src/setup/setup_images/tab_setup.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4a5a750c8256c7d7c3d462aa2acab6eb915efc7 GIT binary patch literal 258 zcmV+d0sa0*Nk%w1VMYKH0J8u9_xSq9%hTZE=JfRR_4W1m`1t$#`~Cg>M)g4tqG z(o_%+BD`=c&vb3yF!B(Ep*9K!13)YqkI1BQ$t*G)ibk){KqQ*jtQMOeZ_^Z{B?R^y&BS-#2dE{rdIm;p69?zkK)o`}dzef4=|t z_3z)mS8v{X`}Xbo_wP@hx%Bk;n_GA8{rmUtb^_n*G) zJ$T~7r>_T(o;h{)@`sP#UcY{Q=-AojDuEB5zA?}SDE?#t8>|B&L4IOj`|5BqX@Ula zOz(m8lQ~xNFRUoJrK7^e{g6SCL%?dmh6*3O+2>zunXy=rg@xlyS&*TD0@uX4^Y4HE zZ)j|);u7Ft6BRDxWD*n+Z=N`5@+5H)K_*v5HnA!5=Fb;nV{~KTS+HVd6Az0!zr?DI zo0KH@JrpW8@0!o0;Hj`u@lf;O-E|6H2NoPvY&v?ZMnRt8)co^RhtA);edFxyvkMd$ zt{gn`;MVh(O3xlXzPjS@{RgjKefjo%-lHd{@BXNH^NrzIad_Un?e!mb$mVS4ms*<5 ybKkOu<>O?#PGRGBJ6CK>HffTx?cx>=Qt4o3_xf~`fp_U~9<5}l&kPzI4AubUchO7$ literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_images/toolbar_separator.gif b/backend/php/src/setup/setup_images/toolbar_separator.gif new file mode 100644 index 0000000000000000000000000000000000000000..e061b56f511246dd2e2a9555de16e1b197ec223e GIT binary patch literal 324 zcmV-K0lWT3Nk%w1VFLgs0M!5h-QB(5;KJkM$ko-e>gv|e(5=eKrq0f*%*?6h=g-p8 zui@dv?Cjh1_3F#Zr`y}Q+1a?$)3My#yXffC<>kxs^XKvL;@8)<-`~LR@88JCqR-5m z#l)A~+P1TCUwy|dT`11Yz`}X$k`ug?!{P@YqrQY7Y0000000000 z00000A^8LV00000EC2ui00RIg000JIz@5-W%o%aWn)1eMj2abF#j>(wIvK`>K_C$( zuSvp{pp+#~V?X1E8 literal 0 HcmV?d00001 diff --git a/backend/php/src/setup/setup_library/authentication.php b/backend/php/src/setup/setup_library/authentication.php new file mode 100644 index 0000000..6a6954a --- /dev/null +++ b/backend/php/src/setup/setup_library/authentication.php @@ -0,0 +1,30 @@ + 0 && $GLOBALS['configuration']['setup_password'] != "" && (!isset($_SESSION['authenticated']) || !$_SESSION['authenticated'])) +{ + if ($_POST['setup_password'] == $GLOBALS['configuration']['setup_password']) + { + $_SESSION['authenticated'] = true; + } + $_POST = null; +} +if ((!isset($_SESSION['authenticated']) || !$_SESSION['authenticated']) && $GLOBALS['configuration']['setup_password'] != "") +{ +?> + + + +Php Object Generator Setup <?=$GLOBALS['configuration']['versionNumber'].$GLOBALS['configuration']['revisionNumber']?> + + +
+

+

+ +

+
+
+ + \ No newline at end of file diff --git a/backend/php/src/setup/setup_library/class.zipfile.php b/backend/php/src/setup/setup_library/class.zipfile.php new file mode 100644 index 0000000..4bbe779 --- /dev/null +++ b/backend/php/src/setup/setup_library/class.zipfile.php @@ -0,0 +1,212 @@ + compressedData[] = $feedArrayRow; + + $newOffset = strlen(implode("", $this->compressedData)); + + $addCentralRecord = "\x50\x4b\x01\x02"; + $addCentralRecord .="\x00\x00"; + $addCentralRecord .="\x0a\x00"; + $addCentralRecord .="\x00\x00"; + $addCentralRecord .="\x00\x00"; + $addCentralRecord .="\x00\x00\x00\x00"; + $addCentralRecord .= pack("V",0); + $addCentralRecord .= pack("V",0); + $addCentralRecord .= pack("V",0); + $addCentralRecord .= pack("v", strlen($directoryName) ); + $addCentralRecord .= pack("v", 0 ); + $addCentralRecord .= pack("v", 0 ); + $addCentralRecord .= pack("v", 0 ); + $addCentralRecord .= pack("v", 0 ); + $ext = "\x00\x00\x10\x00"; + $ext = "\xff\xff\xff\xff"; + $addCentralRecord .= pack("V", 16 ); + + $addCentralRecord .= pack("V", $this -> oldOffset ); + $this -> oldOffset = $newOffset; + + $addCentralRecord .= $directoryName; + + $this -> centralDirectory[] = $addCentralRecord; + } + + /** + * Function to add file(s) to the specified directory in the archive + * + * @param $directoryName string + * + */ + + function addFile($data, $directoryName) { + + $directoryName = str_replace("\\", "/", $directoryName); + + $feedArrayRow = "\x50\x4b\x03\x04"; + $feedArrayRow .= "\x14\x00"; + $feedArrayRow .= "\x00\x00"; + $feedArrayRow .= "\x08\x00"; + $feedArrayRow .= "\x00\x00\x00\x00"; + + $uncompressedLength = strlen($data); + $compression = crc32($data); + $gzCompressedData = gzcompress($data); + $gzCompressedData = substr( substr($gzCompressedData, 0, strlen($gzCompressedData) - 4), 2); + $compressedLength = strlen($gzCompressedData); + $feedArrayRow .= pack("V",$compression); + $feedArrayRow .= pack("V",$compressedLength); + $feedArrayRow .= pack("V",$uncompressedLength); + $feedArrayRow .= pack("v", strlen($directoryName) ); + $feedArrayRow .= pack("v", 0 ); + $feedArrayRow .= $directoryName; + + $feedArrayRow .= $gzCompressedData; + + $feedArrayRow .= pack("V",$compression); + $feedArrayRow .= pack("V",$compressedLength); + $feedArrayRow .= pack("V",$uncompressedLength); + + $this -> compressedData[] = $feedArrayRow; + + $newOffset = strlen(implode("", $this->compressedData)); + + $addCentralRecord = "\x50\x4b\x01\x02"; + $addCentralRecord .="\x00\x00"; + $addCentralRecord .="\x14\x00"; + $addCentralRecord .="\x00\x00"; + $addCentralRecord .="\x08\x00"; + $addCentralRecord .="\x00\x00\x00\x00"; + $addCentralRecord .= pack("V",$compression); + $addCentralRecord .= pack("V",$compressedLength); + $addCentralRecord .= pack("V",$uncompressedLength); + $addCentralRecord .= pack("v", strlen($directoryName) ); + $addCentralRecord .= pack("v", 0 ); + $addCentralRecord .= pack("v", 0 ); + $addCentralRecord .= pack("v", 0 ); + $addCentralRecord .= pack("v", 0 ); + $addCentralRecord .= pack("V", 32 ); + + $addCentralRecord .= pack("V", $this -> oldOffset ); + $this -> oldOffset = $newOffset; + + $addCentralRecord .= $directoryName; + + $this -> centralDirectory[] = $addCentralRecord; + } + + /** + * Fucntion to return the zip file + * + * @return zipfile (archive) + */ + + function getZippedfile() { + + $data = implode("", $this -> compressedData); + $controlDirectory = implode("", $this -> centralDirectory); + + return + $data. + $controlDirectory. + $this -> endOfCentralDirectory. + pack("v", sizeof($this -> centralDirectory)). + pack("v", sizeof($this -> centralDirectory)). + pack("V", strlen($controlDirectory)). + pack("V", strlen($data)). + "\x00\x00"; + } + + /** + * + * Function to force the download of the archive as soon as it is created + * + * @param archiveName string - name of the created archive file + */ + + function forceDownload($archiveName) { + $headerInfo = ''; + header("Pragma: public"); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Cache-Control: private",false); + header("Content-Type: application/zip"); + header("Content-Disposition: attachment; filename=".basename($archiveName).";" ); + header("Content-Transfer-Encoding: binary"); + echo $this->getZippedfile(); + + } + + /** + * Generates zip file from POG package. + * + * @param multi-d array $package + * @param array $paths + */ + function addPOGPackage($package, $paths=array()) + { + + $i = 0; + foreach ($package as $key=>$value) + { + $path = ''; + foreach ($paths as $p) + { + $path .= (($path == '') ? $p : "/$p"); + } + if (strpos($key, ".") == false) + { + $paths[] = $key; + $this->addDirectory((($path == '') ? "$key/" : "$path/$key/")); + $this->addPOGPackage($package[$key], &$paths); + } + else + { + $this->addFile(base64_decode($value), (($path == '') ? $key : "$path/$key")); + } + if ($i == (sizeof($package)-1)) + { + array_pop($paths); + } + $i++; + } + } +} +?> \ No newline at end of file diff --git a/backend/php/src/setup/setup_library/inc.footer.php b/backend/php/src/setup/setup_library/inc.footer.php new file mode 100644 index 0000000..d00549d --- /dev/null +++ b/backend/php/src/setup/setup_library/inc.footer.php @@ -0,0 +1,6 @@ + +
PHP Object Generator | +POG Weblog | +Google group | +Tutorials | +Contact us \ No newline at end of file diff --git a/backend/php/src/setup/setup_library/inc.header.php b/backend/php/src/setup/setup_library/inc.header.php new file mode 100644 index 0000000..e53b36d --- /dev/null +++ b/backend/php/src/setup/setup_library/inc.header.php @@ -0,0 +1,36 @@ + + + +Php Object Generator Setup <?=$GLOBALS['configuration']['versionNumber'].$GLOBALS['configuration']['revisionNumber']?> + + + + + +
+ + + +
\ No newline at end of file diff --git a/backend/php/src/setup/setup_library/setup_misc.php b/backend/php/src/setup/setup_library/setup_misc.php new file mode 100644 index 0000000..f0e4f0e --- /dev/null +++ b/backend/php/src/setup/setup_library/setup_misc.php @@ -0,0 +1,2357 @@ + $property) + { + if (isset($property['db_attributes'][2])) + //length is specified, for e.g. if attribute = VARCHAR(255), $property[2]=255 + { + $limit = explode(',', $property['db_attributes'][2]); + //field is limited + if (intval($limit[0]) > 0) + { + if (isset($limit[1]) && intval($limit[1]) > 0) + { + //decimal, enum, set + $attribute_testValues[$attribute] = substr(${$property['db_attributes'][1]}, 0, ceil($limit[0]*0.6)).".".substr(${$property['db_attributes'][1]}, 0, $limit[1]); + } + else + { + $attribute_testValues[$attribute] = substr(${$property['db_attributes'][1]}, 0, ceil($limit[0] * 0.6)); + } + } + } + else + //length not specified, but we still need to account for default mysql behavior + //for eg, FLOAT(X), if X isn't specified, mysql defaults to (10,2). + { + if ($property['db_attributes'][1] == "FLOAT" || $property['db_attributes'][1] == "DOUBLE") + { + $attribute_testValues[$attribute] = "1234.56"; + } + else if ($property['db_attributes'][1] != "HASMANY" && $property['db_attributes'][1] != "BELONGSTO" && $property['db_attributes'][1] != "JOIN") + { + $attribute_testValues[$attribute] = ${$property['db_attributes'][1]}; + } + } + } + return $attribute_testValues; + } + + /** + * Specifies how object attributes are rendered during scaffolding (step 3 of the setup process) + * Todo: Can be improved but satisfactory for now + * @param string $attributeName + * @param string $attributeType + * @param string $attributeValue + * @param int $objectId + * @return string $html + */ + function ConvertAttributeToHtml($attributeName, $attributeProperties, $attributeValue='', $objectId='') + { + switch ($attributeProperties[1]) + { + case "ENUM": + $enumParts = explode(',', $attributeProperties[2]); + $html = ""; + break; + case "HASMANY": + case "JOIN": + case "BELONGSTO": + $html = $attributeValue; + break; + case "MEDIUMBLOB": + $html = "sorry. cannot render attribute of type LONGBLOB"; + break; + case "LONGBLOB": + $html = "sorry. cannot render attribute of type LONGBLOB"; + break; + case "TEXT": + case "LONGTEXT": + case "BINARY": + case "MEDIUMTEXT": + case "TINYTEXT": + case "VARCHAR": + case "TINYBLOB": + case "BLOB": + $html = ""; + break; + case "DATETIME": + case "DATE": + case "TIMESTAMP": + case "TIME": + case "YEAR": + case "DECIMAL": + case "DOUBLE": + case "FLOAT": + case "BIGINT": + case "INT": + case "YEAR": + case "SMALLINT": + case "MEDIUMINT": + case "TINYINT": + case "CHAR": + $html = ""; + break; + default: + $html = substr($attributeValue, 0, 500); + if (strlen($attributeValue) > 500) + { + $html .= "..."; + } + break; + } + return $html; + } + + /** + * Renders an object as an Xtree Node + * + * @param unknown_type $child + */ + function ConvertObjectToNode(&$instance, &$masterNode, $js, $anchor, $once = false) + { + $attributeList = array_keys(get_object_vars($instance)); + $objectName = $className = get_class($instance); + $node = &$masterNode->addItem(new XNode("[".$instance->{strtolower($className)."Id"}."] ", false,"setup_images/folderclose.gif","setup_images/folderopen.gif")); + + //regular attributes + foreach($attributeList as $attribute) + { + if ($attribute != "pog_attribute_type" && $attribute!= "pog_query" ) + { + if (isset($instance->pog_attribute_type[$attribute])) + { + $thisValue = ConvertAttributeToHtml($attribute, $instance->pog_attribute_type[$attribute]['db_attributes'], $instance->{$attribute}, $instance->{$attributeList[0]}); + $subnode = &$node->addItem(new XNode("
".$attribute."{".$instance->pog_attribute_type[$attribute]['db_attributes'][1]."}
".str_replace("\0", "", $thisValue)."

", false,'',"setup_images/folderopen.gif")); + } + } + } + + //parents, children and mapping + foreach ($instance->pog_attribute_type as $attribute_name => $attrubute_type) + { + if ($attrubute_type['db_attributes'][1] == "HASMANY" || $attrubute_type['db_attributes'][1] == "BELONGSTO" || $attrubute_type['db_attributes'][1] == "JOIN") + { + if ($attrubute_type['db_attributes'][1] == "BELONGSTO") + { + eval ('$value = $instance->'.strtolower($attribute_name).'Id;'); + $thisValue = ConvertAttributeToHtml($attribute_name, $attrubute_type['db_attributes'], $value, ''); + $subnode = &$node->addItem(new XNode("
".$attribute_name."{".($attrubute_type['db_attributes'][1] == "HASMANY" ? "CHILD" : "PARENT")."}
".$thisValue."

", false,'',"setup_images/folderopen.gif")); + } + else + { + $value = ''; + eval('$siblingList = $instance->Get'.ucfirst(strtolower($attribute_name)).'List();'); + if (sizeof($siblingList) > 0) + { + $myNode = &$node->addItem(new XNode("[".$attribute_name."List]{Dimensions:[".sizeof($siblingList)."]}", false, "setup_images/folderclose.gif","setup_images/folderopen.gif", true)); + $child = $siblingList[0]; + $js2 = "new Array("; + $attributeList = array_keys(get_object_vars($child)); + $x=0; + foreach($attributeList as $attribute) + { + if ($attribute != "pog_attribute_type" && $attribute!= "pog_query") + { + if ($x != 0 && isset($child->pog_attribute_type[$attribute])) + { + $js2 .= '"'.$attribute.'",'; + } + } + $x++; + } + $js2 = trim($js2, ","); + $js2 .= ")"; + + if (!$once) + { + foreach ($siblingList as $child) + { + /*$value .= $child->{strtolower($attribute_name)."Id"} . ",";*/ + if ($attrubute_type['db_attributes'][1] == "JOIN") + { + ConvertObjectToNode($child, $myNode, $js2, $anchor, true); + } + else + { + ConvertObjectToNode($child, $myNode, $js2, $anchor); + } + } + } + } + else + { + $node->addItem(new XNode("[".$attribute_name."List]{Dimensions:[0]}

", false, '',"setup_images/folderopen.gif")); + } + } + } + } + $subnode = &$node->addItem(new XNode("
{strtolower($objectName).'Id'}."\", this.parentNode.parentNode.parentNode.parentNode.id, $js, \"$anchor\");return false;'>
", false,'',"folderopen.gif")); + } + + + /** + * Populates object attributes with test values + * + * @param unknown_type $object + * @return unknown + */ + function PopulateTestValues(&$object) + { + $attributeList = array_keys(get_object_vars($object)); + $type_value = InitializeTestValues($object->pog_attribute_type); + + $objectName = get_class($object); + foreach($attributeList as $attribute) + { + if (isset($object->pog_attribute_type[$attribute])) + { + if (isset($type_value[$attribute])) + { + $object->{$attribute} = $type_value[$attribute]; + } + else if ($object->pog_attribute_type[$attribute]['db_attributes'][0] != "OBJECT") + { + $object->{$attribute} = "1"; + } + } + } + eval ("\$object -> ".strtolower($objectName)."Id = '';"); + return $object; + } + + /** + * Extracts @link from object file + * + * @param unknown_type $objectFilePath + * @return unknown + */ + function GetAtLink($objectFilePath) + { + $link = ''; + $content = file_get_contents($objectFilePath); + $contentParts = split("",$content); + if (isset($contentParts[1])) + { + $contentParts2 = split("",$contentParts[1]); + } + if (isset($contentParts2[0])) + { + $className = trim($contentParts2[0]); + } + if (isset($className)) + { + $linkParts1 = split("\*\/", $contentParts[1]); + $linkParts2 = split("\@link", $linkParts1[0]); + if (isset($linkParts2[1])) + { + $link = $linkParts2[1]; + } + if (isset($GLOBALS['configuration']['homepage']) && isset($link)) + { + $linkParts = explode('?', $link); + if (isset($linkParts[1])) + { + $link = $GLOBALS['configuration']['homepage'].'/?'.$linkParts[1]; + } + } + } + return $link; + } + + /** + * Extracts object name from object file. Do not rely on filename. + * + * @param unknown_type $objectFilePath + */ + function GetObjectName($objectFilePath) + { + $content = file_get_contents($objectFilePath); + $contentParts = split("",$content); + if (isset($contentParts[1])) + { + $contentParts2 = split("",$contentParts[1]); + } + if (isset($contentParts2[0])) + { + $className = trim($contentParts2[0]); + } + return $className; + } + + /** + * Gets plugin name based on filename + * + * @param unknown_type $fileName + * @return unknown + */ + function GetPluginName($fileName) + { + $fileNameParts = explode('.', $fileName); + if (strtolower($fileName) != "iplugin.php" && strtolower($fileNameParts[0]) == 'plugin' && strtolower($fileNameParts[2]) == 'php') + { + return $fileNameParts[1]; + } + return ''; + } + + /** + * Adds message to error queue + * + * @param unknown_type $error + */ + function AddError($error) + { + if (isset($_SESSION['errorMessages'])) + { + $errorMessages = unserialize($_SESSION['errorMessages']); + if (array_search($error, $errorMessages) === false) + { + $errorMessages[] = $error; + } + } + else + { + $errorMessages = array(); + $errorMessages[] = $error; + } + $_SESSION['errorMessages'] = serialize($errorMessages); + } + + /** + * Add message to tracing queue + * + * @param unknown_type $trace + */ + function AddTrace($trace) + { + if (isset($_SESSION['traceMessages'])) + { + $traceMessages = unserialize($_SESSION['traceMessages']); + $traceMessages[] = $trace; + } + else + { + $traceMessages = array(); + $traceMessages[] = $trace; + } + $_SESSION['traceMessages'] = serialize($traceMessages); + } + + /** + * Unit tests + */ + + /** + * Test the base 5 CRUD methods + * + * @param unknown_type $instance + * @return unknown + */ + function TestEssentials($instance, $optimizeAsWell = true) + { + if(TestIsMapping($instance)) + { + return true; + } + $errors = 0; + if (!TestSave($instance)) + { + $errors++; + } + if (!TestSaveNew($instance)) + { + $errors++; + } + if (!TestDelete($instance)) + { + $errors++; + } + if (!TestGetList($instance)) + { + $errors++; + } + if (!TestDeleteList($instance)) + { + $errors++; + } + if ($optimizeAsWell) + { + if (!TestOptimizeStorage(strtolower(get_class($instance)))) + { + $errors++; + } + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Enter description here... + * + * @param unknown_type $instance + * @return unknown + */ + function TestRelationsPreRequisites($instance, $allObjectsList, $thisObjectName, $ignoreObjects) + { + if(TestIsMapping($instance)) + { + AddTrace("\tIs Mapping (OK)"); + return true; + } + if (TestIsSingle($instance)) + { + AddTrace("\tIs single (OK)"); + return true; + } + else + { + if (!TestParentChildLink($instance, $allObjectsList, $thisObjectName, $ignoreObjects) || !TestAssociationLink($instance, $allObjectsList, $thisObjectName, $ignoreObjects)) + { + return false; + } + else + { + AddTrace("\tIs properly connected (OK)"); + return true; + } + } + } + + /** + * Test the optional object relations methods + * + * @param unknown_type $instance + * @return unknown + */ + function TestRelations($instance, $ignoreObjects) + { + $errors=0; + if (TestIsParent($instance)) + { + if (!TestAddChild($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestGetChildrenList($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestDeleteDeep_Child($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestSaveDeep_Child($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestSetChildrenList($instance, true, $ignoreObjects)) + { + $errors++; + } + } + if (TestIsChild($instance)) + { + if (!TestSetParent($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestGetParent($instance, true, $ignoreObjects)) + { + $errors++; + } + } + if (TestIsSibling($instance)) + { + if (!TestAddSibling($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestGetSiblingList($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestSaveDeep_Sibling($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestDeleteDeep_Sibling($instance, true, $ignoreObjects)) + { + $errors++; + } + if (!TestSetSiblingList($instance, true, $ignoreObjects)) + { + $errors++; + } + } + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Tests whether object table already exists + * + */ + function TestStorageExists($objectName, $databaseType = "mysql") + { + switch ($databaseType) + { + case "mysql": + $query = "show tables like '".strtolower($objectName)."'"; + break; + case "sqlite": + $query = "select name FROM sqlite_master WHERE type='table' and name='".strtolower($objectName)."'"; + break; + case "pgsql": + $query = "select table_name FROM information_schema.tables WHERE table_schema = 'public' and table_name='".strtolower($objectName)."'"; + break; + case "odbc": + //assume mssql + $query = "select * from information_schema.tables where table_type = 'BASE TABLE' and table_name='".strtolower($objectName)."'"; + break; + case "firebird": + AddError("POG Setup doesn't support automatic table detection for Firebird databases yet. Therefore, your objects/tables may be misaligned. If POG Essential tests failed, this may very well be the case. Create the tables manually and re-run setup."); + return true; + break; + } + + $connection = Database::Connect(); + $rows = Database::Query($query, $connection); + if ($rows > 0) + { + return true; + } + return false; + } + + /** + * Creates the table to store objects + * + */ + function TestCreateStorage($objectFilePath, $databaseType = "mysql") + { + if ($databaseType == "firebird") + { + AddError("POG Setup doesn't support automatic table creation for Firebird databases yet. Therefore, your objects/tables may be misaligned. If POG Essential tests failed, this may very well be the case. Create the tables manually and re-run setup."); + return true; + } + + $objectName = GetObjectName($objectFilePath); + + //extract sql + $content = file_get_contents($objectFilePath); + $contentParts = split("",$content); + if (isset($contentParts[1])) + { + $contentParts2 = split("",$contentParts[1]); + } + if (isset($contentParts2[0])) + { + $className = trim($contentParts2[0]); + } + if (isset($className)) + { + $sqlParts = split(";",$contentParts[0]); + $sqlPart = split("CREATE",$sqlParts[0]); + $sql = "CREATE ".$sqlPart[1].";"; + + //execute sql + $connection = Database::Connect(); + if (Database::NonQuery($sql, $connection) !== false) + { + return true; + } + } + AddError("Query failed: $sql"); + return false; + } + + /** + * Drops the table for the corresponding object + * + */ + function TestDeleteStorage($object, $databaseType = "mysql") + { + $tableName = strtolower(get_class($object)); + $connection = Database::Connect(); + if (Database::NonQuery('drop table `'.strtolower($tableName).'`', $connection) !== false) + { + return true; + } + return false; + } + + /** + * Executes an arbitrary query + * + * @param unknown_type $query + */ + function TestExecuteQuery($query) + { + $connection = Database::Connect(); + if ($query == "") + { + return true; + } + if (Database::NonQuery($query, $connection) !== false) + { + return true; + } + return false; + } + + /** + * Enter description here... + * + * @param unknown_type $object + * @return unknown + */ + function TestAlterStorage($object, $databaseType = "mysql") + { + if ($databaseType != "mysql") + { + AddTrace("POG Setup doesn't support table automatic alteration for non-MySQL databases yet. Therefore, your objects/tables may be misaligned. If POG Essential tests failed, this may very well be the case. Drop and recreate the tables and re-run setup."); + return true; + } + + //find object attributes/table columns mismatch + $tableName = strtolower(get_class($object)); + $columns = array(); + + $query = "describe `$tableName` "; + $connection = Database::Connect(); + $cursor = Database::Reader($query, $connection); + if ($cursor !== false) + { + while ($row = Database::Read($cursor)) + { + $columns[$row["Field"]] = $row["Type"]; + } + + $attribute_types = $object -> pog_attribute_type; + $lowerAttributes = array(); + foreach (array_keys($attribute_types) as $key) + { + $lowerAttributes[strtolower($key)] = $attribute_types[$key]; + } + + //columns to remove + $columnsToRemove = array_diff(array_keys($columns), array_keys($lowerAttributes)); + + //columns to add + $columnsToAdd = array_diff(array_keys($lowerAttributes), array_keys($columns)); + + //columns whose type has changed + $otherColumns = array_intersect(array_keys($lowerAttributes), array_keys($columns)); + + $columnsToModify = array(); + foreach ($otherColumns as $otherColumn) + { + $type = strtolower($lowerAttributes[$otherColumn]['db_attributes'][1]); + if ($type == 'enum' || $type == 'set') + { + $enumPartsObj = explode(',', strtolower($lowerAttributes[$otherColumn]['db_attributes'][2])); + $parts = explode('(',$columns[$otherColumn]); + $parts2 = explode(')',$parts[1]); + $enumpartsDb = explode(',', strtolower(trim($parts2[0]))); + foreach ($enumPartsObj as $ep) + { + if (array_search(trim($ep), $enumpartsDb) === false) + { + $type .= "(".$lowerAttributes[$otherColumn]['db_attributes'][2].")"; + $columnsToModify[$otherColumn] = $type; + break; + } + } + } + else + { + if (isset($lowerAttributes[$otherColumn]['db_attributes'][2])) + { + $type .= "(".$lowerAttributes[$otherColumn]['db_attributes'][2].")"; + } + if (strpos(strtolower($columns[$otherColumn]), $type) === false && $type != "hasmany" && $type != "join") + { + if ($type == "belongsto") + { + $columnsToModify[strtolower($otherColumn)] = "int"; + } + else + { + $columnsToModify[$otherColumn] = $type; + } + } + } + } + + $columnsToRemove2 = array(); + foreach ($columnsToRemove as $c) + { + $columnsToRemove2[] = strtolower($c); + } + + $columnsToRemove = $columnsToRemove2; + + $columnsToAdd2 = array(); + foreach ($columnsToAdd as $c) + { + if ($lowerAttributes[$c]['db_attributes'][1] != "HASMANY" && $lowerAttributes[$c]['db_attributes'][1] != "JOIN") + { + if ($lowerAttributes[$c]['db_attributes'][1] == "BELONGSTO") + { + $colMarkedForDeletion = array_search(strtolower($c)."id", $columnsToRemove); + if ($colMarkedForDeletion === false) //this is clumsy, until we think of something better + { + $columnsToAdd2[] = strtolower($c)."id int"; + } + else + { + //remove entry from columnsToRemove since they are the same. Will lose data if dropped & recreated + array_splice($columnsToRemove, $colMarkedForDeletion, 1); + } + } + else + { + $columnsToAdd2[] = $c; + } + } + } + + $common = array(); + $common = array_intersect($columnsToAdd2, $columnsToRemove); + + $columnsToAdd = array(); + foreach ($columnsToAdd2 as $col) + { + if (array_search($col, $common) === false) + { + $columnsToAdd[] = $col; + } + } + $columnsToRemove2 = array(); + foreach ($columnsToRemove as $col) + { + if (array_search($col, $common) === false) + { + $columnsToRemove2[] = $col; + } + } + + + if (sizeof($columnsToAdd) == 0 && sizeof($columnsToRemove2) == 0 && sizeof($columnsToModify) == 0) + { + return true; + } + + //construct query + $query = "alter table `$tableName` "; + + foreach ($columnsToRemove2 as $remove) + { + $query .= "drop column `$remove`,"; + } + + foreach ($columnsToAdd as $add) + { + $columnType = ''; + if (isset($lowerAttributes[$add])) + { + $columnType = strtolower($lowerAttributes[$add]['db_attributes'][1]); + } + if (isset($lowerAttributes[$add]['db_attributes'][2])) + { + $columnType .= "(".$lowerAttributes[$add]['db_attributes'][2].")"; + } + if ($columnType != '') + { + $query .= "add column `$add` $columnType,"; + } + else + { + $query .= "add column $add,"; + } + } + + + foreach (array_keys($columnsToModify) as $modify) + { + $query .= "modify `$modify` ".$columnsToModify[$modify].","; + } + $query = trim($query, ','); + //execute query + + if (Database::NonQuery($query, $connection) !== false) + { + return true; + } + } + AddError("Query failed: $query"); + return false; + } + + /** + * Optimizes the table by running mysql optimize + * + * @param unknown_type $objectName + * @return unknown + */ + function TestOptimizeStorage($objectName) + { + $connection = Database::Connect(); + if (Database::NonQuery("optimize table `".strtolower($objectName)."`", $connection) !== false) + { + AddTrace("\tOptimizing....OK!"); + return true; + } + return false; + } + + /** + * Unit test for Save() + * + */ + function TestSave($object, $trace=true) + { + $className = get_class($object); + $object = PopulateTestValues($object); + $objectId = false; + $object->{strtolower($className)."Id"} = ""; + $objectId = $object->Save(false); + + if(!$objectId) + { + if ($trace) + { + AddTrace("\tSave() failed"); + AddError("Query failed: ".$object->pog_query); + } + return false; + } + //cleanup test data + $query = "delete from `".strtolower($className)."` where ".strtolower($className)."id = '".$objectId."';"; + $connection = Database::Connect(); + Database::NonQuery($query, $connection); + if ($trace) + { + AddTrace("\tSave()....OK!"); + } + return true; + } + + /** + * Unit test for SaveNew() + * + */ + function TestSaveNew($object, $trace = true) + { + $className = get_class($object); + if(!TestSave($object, false)) + { + if ($trace) + { + AddTrace("\tSaveNew() ignored"); + } + return false; + } + $objectId = $object->SaveNew(false); + if ($objectId) + { + $query = "delete from `".strtolower($className)."` where ".strtolower($className)."Id = '".$objectId."';"; + $connection = Database::Connect(); + Database::NonQuery($query, $connection); + if ($trace) + { + AddTrace("\tSaveNew()....OK!"); + } + return true; + } + if ($trace) + { + AddTrace("\tSaveNew() failed"); + AddError("Query failed: ".$object->pog_query); + } + return false; + } + + /** + * Unit test for GetList(). Implicitly tests Get() + * + */ + function TestGetList($object, $trace = true) + { + if ($trace) + { + AddTrace("\tGetList()"); + } + $errors = 0; + if (TestSave($object,false) && TestSaveNew($object, false) && TestDelete($object, false)) + { + $className = get_class($object); + $objectList = $object->GetList(array(array(strtolower($className)."Id", ">", 0))); + $oldCount = count($objectList); + $object = PopulateTestValues($object); + $objectId = false; + $object->{strtolower($className)."Id"} = 0; + $objectId = $object->Save(false); + $objectId2 = $object->SaveNew(false); + $objectId3 = $object->SaveNew(false); + + + //Test Multiple Conditions + $objectList = $object->GetList(array(array(strtolower($className)."Id", ">=",$objectId), array(strtolower($className)."Id", "<=", $objectId+2)), strtolower($className)."Id", false, 2); + if (sizeof($objectList) != 2) + { + //Test Limit + if ($trace) + { + AddTrace("\t\tLimit failed"); + AddError('ERROR: GetList() :sizeof(list) != \$limit\n'); + AddError("Query failed: ".$object->pog_query); + } + $errors++; + } + else + { + if ($trace) + { + AddTrace("\t\tLimit....OK!"); + } + } + if ($objectList[1]->{strtolower($className)."Id"} > $objectList[0]->{strtolower($className)."Id"}) + { + //Test Sorting + if ($trace) + { + AddTrace("\t\tSorting failed"); + AddError("ERROR: GetList() :list is not properly sorted"); + AddError("Query failed: ".$object->pog_query); + } + $errors++; + } + else + { + if ($trace) + { + AddTrace("\t\tSorting....OK!"); + } + } + if ($errors == 0) + { + $objectList = $object->GetList(array(array(strtolower($className)."Id", ">=",$objectId), array(strtolower($className)."Id", "<=", $objectId+2)), strtolower($className)."Id", false, 3); + foreach ($objectList as $object) + { + $attributeList = array_keys(get_object_vars($object)); + foreach ($attributeList as $attribute) + { + if (isset($object->pog_attribute_type[$attribute])) + { + if (isset($type_value[$attribute])) + { + if ($object->{$attribute} != $type_value[$attribute]) + { + if($trace) + { + AddError("WARNING: Failed to retrieve attribute `$attribute`. Expecting `".$type_value[$attribute]."`; found `".$object->{$attribute}."`. Check that column `$attribute` in the `$className` table is of type `".$object->pog_attribute_type[$attribute]['db_attributes'][1]."`"); + } + } + } + } + } + $object->Delete(); + } + return true; + } + else + { + if ($trace) + { + AddTrace("\tGetList() failed"); + AddError("Query failed: ".$object->pog_query); + } + return false; + } + } + if ($trace) + { + AddTrace("\tGetList() ignored"); + } + return false; + } + + /** + * Unit test for Delete() + * + */ + function TestDelete($object, $trace = true) + { + if(!TestSave($object, false)) + { + if ($trace) + { + AddTrace("\tDelete() ignored"); + } + return false; + } + $object = PopulateTestValues($object); + $object->Save(false); + if ($object->Delete(false)) + { + if ($trace) + { + AddTrace("\tDelete()....OK!"); + } + return true; + } + if ($trace) + { + AddTrace("\tDelete() failed"); + AddError("Query failed: ".$object->pog_query); + } + return false; + } + + /** + * Unit Test for DeleteList() + * + * @param unknown_type $object + * @param unknown_type $trace + */ + function TestDeleteList($object, $trace = true) + { + $className = get_class($object); + if(!TestSave($object, false) || !TestGetList($object, false)) + { + if ($trace) + { + AddTrace("\tDeleteList() ignored"); + } + return false; + } + + $object = PopulateTestValues($object); + + $originalCount = GetNumberOfRecords($className); + + $objectId = false; + $object->{strtolower($className)."Id"} = 0; + $objectId = $object->Save(false); + $objectId2 = $object->SaveNew(false); + $objectId3 = $object->SaveNew(false); + + $className = get_class($object); + $object->DeleteList(array(array(strtolower($className)."Id", "=", $objectId), array("or"), array(strtolower($className)."Id", "=", $objectId2), array("or"), array(strtolower($className)."Id", "=", $objectId3))); + + $newCount = GetNumberOfRecords($className); + + if ($newCount == $originalCount) + { + if ($trace) + { + AddTrace("\tDeleteList()....OK!"); + } + return true; + } + + if ($trace) + { + AddTrace("\tDeleteList() failed"); + AddError("Query failed: ".$object->pog_query); + } + return false; + } + + /** + * Tests whether the object is connected at all + * + * @param unknown_type $object + * @param unknown_type $allObjectsList + */ + function TestIsSingle($object) + { + $attribute_types = $object->pog_attribute_type; + + //get all child classes + $childrenList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "HASMANY") + { + $childrenList[] = $key; + } + } + + //get all parent classes + $parentsList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "BELONGSTO") + { + $parentsList[] = $key; + } + } + + //get all associations + $associationsList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "JOIN") + { + $associationsList[] = $key; + } + } + + if (sizeof($childrenList) == 0 && sizeof($parentsList) == 0 && sizeof($associationsList) == 0) + { + return true; + } + return false; + } + + /** + * Tests that all parents have children and vice-versa + * + * @param unknown_type $object + * @param unknown_type $allObjectsList + * @param unknown_type $thisObjectName + * @return unknown + */ + function TestParentChildLink($object, $allObjectsList, $thisObjectName = '', $ignoreObjects) + { + $attribute_types = $object->pog_attribute_type; + + //get all child classes + $childrenList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "HASMANY") + { + $childrenList[] = $key; + } + } + + //get all parent classes + $parentsList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "BELONGSTO") + { + $parentsList[] = $key; + } + } + + $errors = 0; + foreach ($childrenList as $child) + { + if (array_search($child, $allObjectsList) === false) + { + $errors++; + AddError("$thisObjectName refers to $child as {Child}, which couldn't be found. Generate the $child object with reference to $thisObjectName as {Parent}"); + } + else + { + //test that child refers to this object as parent + eval ("\$childInstance = new $child();"); + $childAttributes = array_keys($childInstance->pog_attribute_type); + if (array_search($thisObjectName, $childAttributes) === false) + { + $errors++; + AddError("$thisObjectName refers to $child as {Child}, but $child does not refer to $thisObjectName as {Parent}. Relations need to be reciprocal."); + } + } + } + + foreach ($parentsList as $parent) + { + if (array_search($parent, $allObjectsList) === false) + { + $errors++; + AddError("$thisObjectName refers to $parent as parent, which couldn't be found. Generate the $parent object with reference to $thisObjectName as {Child}"); + } + else + { + //test that parent refers to this object as child + eval ("\$parentInstance = new $parent();"); + $parentAttributes = array_keys($parentInstance->pog_attribute_type); + if (array_search($thisObjectName, $parentAttributes) === false) + { + $errors++; + AddError("$thisObjectName refers to $parent as {Parent}, but $parent does not refer to $thisObjectName as {Child}. Relations need to be reciprocal."); + } + } + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Tests that all Joins have reciprocal links + * + * @param unknown_type $object + * @param unknown_type $allObjectsList + * @param unknown_type $thisObjectName + */ + function TestAssociationLink($object, $allObjectsList, $thisObjectName = '', $ignoreObjects) + { + $attribute_types = $object->pog_attribute_type; + + //get all join classes + $associationsList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "JOIN") + { + $associationsList[] = $key; + } + } + + $errors = 0; + foreach ($associationsList as $association) + { + if (array_search($association, $allObjectsList) === false) + { + $errors++; + AddError("$thisObjectName refers to $association as {SIBLING}, which couldn't be found. Generate the $association object with reference to $thisObjectName as {SIBLING}"); + } + else + { + //test that association refers to this object as map + eval ("\$associationInstance = new $association();"); + $associationAttributes = array_keys($associationInstance->pog_attribute_type); + if (array_search($thisObjectName, $associationAttributes) === false) + { + $errors++; + AddError("$thisObjectName refers to $association as {SIBLING}, but $association does not refer to $thisObjectName as {SIBLING}. Relations need to be reciprocal."); + } + } + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test to see if object is a parent + * + * @param unknown_type $object + */ + function TestIsParent($object) + { + $attribute_types = $object->pog_attribute_type; + foreach ($attribute_types as $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "HASMANY") + { + return true; + } + } + return false; + } + + /** + * Unit test to see if object is child + * + * @param unknown_type $object + */ + function TestIsChild($object) + { + $attribute_types = $object->pog_attribute_type; + foreach ($attribute_types as $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "BELONGSTO") + { + return true; + } + } + return false; + } + + /** + * Unit test to see if object is Sibling + * + * @param unknown_type $object + * @return unknown + */ + function TestIsSibling($object) + { + $attribute_types = $object->pog_attribute_type; + foreach ($attribute_types as $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "JOIN") + { + return true; + } + } + return false; + } + + /** + * Unit test to see if object is a Mapping object + * + * @param unknown_type $object + */ + function TestIsMapping($object) + { + $funcs = get_class_methods(get_class($object)); + foreach ($funcs as $func) + { + if (strtolower($func) == "addmapping") + { + return true; + } + } + return false; + } + + /** + * Unit test for Save($deep) + * + * @param unknown_type $object + */ + function TestSaveDeep_Child($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + if (!TestAddChild($object, false, $ignoreObjects)) + { + if ($trace) + { + AddTrace("\tSave(deep) ignored"); + AddError("Save(deep) ignored since AddChild could not be performed"); + } + return false; + } + if (!TestGetChildrenList($object, false, $ignoreObjects)) + { + if ($trace) + { + AddTrace("\tSave(deep) ignored"); + AddError("Save(deep) ignored since GetChildrenList could not be performed"); + } + return false; + } + if (!TestDeleteDeep_Child($object, false, $ignoreObjects)) + { + if ($trace) + { + AddTrace("\tSave(deep) ignored"); + AddError("Save(deep) ignored since Delete(deep) could not be performed"); + } + return false; + } + + //get all child classes + $childrenList = array(); + eval("\$object = new $thisObjectName();"); + $object = PopulateTestValues($object); + $attribute_types = $object->pog_attribute_type; + + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "HASMANY") + { + $childrenList[] = $key; + } + } + + $errors = 0; + foreach ($childrenList as $child) + { + //instantiate + eval("\$childInstance = new $child();"); + $childInstance = PopulateTestValues($childInstance); + + //add children + eval ("\$object -> Add$child(\$childInstance);"); + } + + //test + if (!$object->Save(true)) + { + $errors++; + return false; + } + + foreach ($childrenList as $child) + { + //instantiate + eval("\$childArray = \$object->Get".$child."List();"); + if (sizeof($childArray) == 0) + { + if ($trace) + { + AddTrace("\tSave($child) failed"); + + } + $errors++; + } + else + { + if ($trace) + { + AddTrace("\tSave($child)....OK!"); + } + } + } + + //cleanup + $object->Delete(true); + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for Save($deep) + * + * @param unknown_type $object + * @return unknown + */ + function TestSaveDeep_Sibling($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + if (!TestAddSibling($object, false, $ignoreObjects)) + { + if ($trace) + { + AddTrace("\tSave(deep) ignored"); + AddError("Save(deep) ignored since AddSibling could not be performed"); + } + return false; + } + if (!TestGetSiblingList($object, false, $ignoreObjects)) + { + if ($trace) + { + AddTrace("\tSave(deep) ignored"); + AddError("Save(deep) ignored since GetSiblingList could not be performed"); + } + return false; + } + + //get all sibling classes + $siblingList = array(); + eval("\$object = new $thisObjectName();"); + $object = PopulateTestValues($object); + $attribute_types = $object->pog_attribute_type; + + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "JOIN") + { + $siblingList[] = $key; + } + } + + $errors = 0; + + $siblingStore = array(); + + foreach ($siblingList as $sibling) + { + //instantiate + eval("\$siblingInstance = new $sibling();"); + $siblingStore[] = $siblingInstance; + $siblingInstance = PopulateTestValues($siblingInstance); + + //add children + eval ("\$object -> Add$sibling(\$siblingInstance);"); + } + + //test + if (!$object->Save(true)) + { + $errors++; + return false; + } + + foreach ($siblingList as $sibling) + { + //instantiate + eval("\$siblingArray = \$object->Get".$sibling."List();"); + if (sizeof($siblingArray) == 0) + { + if ($trace) + { + AddTrace("\tSave($sibling) failed"); + } + $errors++; + } + else + { + if ($trace) + { + AddTrace("\tSave($sibling)....OK!"); + } + } + } + + //cleanup + $object->Delete(); + foreach($siblingStore as $stored) + { + $stored->Delete(); + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for Delete($deep) + * + * @param unknown_type $object + */ + function TestDeleteDeep_Child($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + $attribute_types = $object->pog_attribute_type; + + if (!TestSetParent($object, false, $ignoreObjects)) + { + AddTrace("\tDelete(deep) ignored"); + return false; + } + //get all child classes + $childrenList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "HASMANY") + { + $childrenList[] = $key; + } + } + + $errors = 0; + + $object = PopulateTestValues($object); + $objectId = $object->Save(false); + + + $childrenStore = array(); + foreach ($childrenList as $child) + { + //instantiate + eval("\$childInstance = new $child();"); + $childInstance = PopulateTestValues($childInstance); + eval("\$childInstance -> Set".$thisObjectName."(\$object);"); + $childInstance -> Save(); + $childrenStore[] = &$childInstance; + } + + //test + if (!$object->Delete(true)) + { + $errors++; + } + + foreach ($childrenList as $child) + { + eval("\$childInstance = new $child();"); + $parentList = $childInstance->GetList(array(array(strtolower($thisObjectName)."Id", "=", $objectId))); + if (sizeof($parentList) > 0) + { + if ($trace) + { + AddTrace("\tDelete($child) failed"); + $errors++; + } + } + else + { + if ($trace) + { + AddTrace("\tDelete($child)....OK!"); + } + } + } + + //cleanup + foreach ($childrenStore as $child); + { + $child->Delete(); + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for Delete($deep) + * + * @param unknown_type $object + * @param unknown_type $trace + */ + function TestDeleteDeep_Sibling($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + $attribute_types = $object->pog_attribute_type; + + if (!TestAddSibling($object, false, $ignoreObjects) || !TestSaveDeep_Sibling($object, false, $ignoreObjects)) + { + AddTrace("\tDelete(deep) ignored"); + return false; + } + //get all sibling classes + $siblingList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "JOIN") + { + $siblingList[] = $key; + } + } + + $errors = 0; + + $object = PopulateTestValues($object); + $object->Save(false); + + $siblingStore = array(); + foreach ($siblingList as $sibling) + { + //instantiate + eval("\$siblingInstance = new $sibling();"); + $siblingInstance = PopulateTestValues($siblingInstance); + eval("\$siblingInstance->Add".$thisObjectName."(\$object);"); + $siblingId = $siblingInstance->Save(); + $siblingStore[] = $siblingId; + } + + //test + if (!$object->Delete(false, true)) + { + $errors++; + } + + $x = 0; + foreach ($siblingList as $sibling) + { + eval("\$siblingInstance = new $sibling();"); + $siblingLeft = $siblingInstance->GetList(array(array(strtolower($sibling)."Id", "=", $siblingStore[$x]))); + if (sizeof($siblingLeft) > 0) + { + if ($trace) + { + AddTrace("\tDelete($sibling) failed"); + $errors++; + } + } + else + { + if ($trace) + { + AddTrace("\tDelete($sibling)....OK!"); + } + } + $x++; + } + + + //cleanup + $object->Delete(); + $x = 0; + foreach ($siblingList as $sibling) + { + eval("\$siblingInstance = new $sibling();"); + if (isset($siblingStore[$x]) && $siblingStore[$x] != '') + { + eval ("\$siblingInstance->".strtolower($sibling)."Id = ".$siblingStore[$x].";"); + $siblingInstance->Delete(); + } + $x++; + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for SetParent() + * + * @param unknown_type $object + */ + function TestSetParent($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + $attribute_types = $object->pog_attribute_type; + + //get all parent classes + $parentList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "BELONGSTO") + { + $parentList[] = $key; + } + } + + $errors = 0; + foreach ($parentList as $parent) + { + //instantiate + eval("\$parentInstance = new $parent();"); + + //save + $parentInstance = PopulateTestValues($parentInstance); + $parentInstance -> Save(false); + + //set parent + eval ("\$object -> Set$parent(\$parentInstance);"); + + eval ("\$objectId = \$object->".strtolower($parent)."Id;"); + + eval ("\$parentId = \$parentInstance->".strtolower($parent)."Id;"); + + if ($objectId != $parentId) + { + if ($trace) + { + AddTrace("\tSet$parent() failed"); + AddError("Could not set $parent as {Parent} of $thisObjectName"); + } + $errors++; + } + else + { + if ($trace) + { + AddTrace("\tSet$parent()....OK!"); + } + } + //cleanup (delete parent) + $parentInstance -> Delete(false); + eval ("\$object->".strtolower($parent)."Id = '';"); + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for GetParent() + * + * @param unknown_type $object + */ + function TestGetParent($object, $ignoreObjects) + { + $thisObjectName = get_class($object); + eval ("\$object = new $thisObjectName();"); + + $attribute_types = $object->pog_attribute_type; + + //get all parent classes + $parentList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "BELONGSTO") + { + $parentList[] = $key; + } + } + + $errors = 0; + + foreach ($parentList as $parent) + { + /*if (TestSetParent($object, false)) + {*/ + //instantiate + eval("\$parentInstance = new $parent();"); + + //save + $parentInstance = PopulateTestValues($parentInstance); + $parentInstance -> Save(false); + + + //set parent + eval ("\$object -> Set$parent(\$parentInstance);"); + + eval("\$myParent = \$object->Get$parent();"); + + eval ("\$objectId = \$object->".strtolower($parent)."Id;"); + + eval ("\$parentId = \$myParent->".strtolower($parent)."Id;"); + + if ($objectId != $parentId) + { + AddTrace("\tGet$parent() failed"); + AddError("Could not retrieve parent object $parent"); + $errors++; + } + else + { + AddTrace("\tGet$parent()....OK!"); + } + + //cleanup (delete parent) + $parentInstance -> Delete(false); + /*} + else + { + AddTrace("\tGet$parent() ignored"); + }*/ + } + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for AddChild() + * + * @param unknown_type $object + */ + function TestAddChild($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + eval ("\$object = new $thisObjectName();"); + $attribute_types = $object->pog_attribute_type; + + $object = PopulateTestValues($object); + + //get all child classes + $childrenList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "HASMANY") + { + $childrenList[] = $key; + } + } + + $errors = 0; + foreach ($childrenList as $child) + { + //instantiate + eval ("\$childInstance = new $child();"); + $childInstance = PopulateTestValues($childInstance); + + //instantiate other + eval("\$childInstance2 = new $child();"); + $childInstance2 = PopulateTestValues($childInstance2); + + //add children + eval ("\$object -> Add$child(\$childInstance);"); + eval ("\$object -> Add$child(\$childInstance2);"); + + //verify that children were added + + eval ("\$children = \$object->".strtolower($child)."List;"); + + if (sizeof($children) != 2) + { + if ($trace) + { + AddTrace("\tAdd$child() failed"); + AddError("Could not add child object $child"); + } + $errors++; + } + else + { + if ($trace) + { + AddTrace("\tAdd$child()....OK!"); + } + } + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for GetChildrenList() + * + * @param unknown_type $object + */ + function TestGetChildrenList($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + eval ("\$object = new $thisObjectName();"); + $attribute_types = $object->pog_attribute_type; + $errors = 0; + + //get all child classes + $childrenList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "HASMANY") + { + $childrenList[] = $key; + } + } + + //save shallow + $object = PopulateTestValues($object); + $object->Save(false); + + + foreach ($childrenList as $child) + { + //instantiate + eval("\$childInstance = new $child();"); + $childInstance = PopulateTestValues($childInstance); + + if (!TestSetParent($childInstance, false, $ignoreObjects)) + { + AddTrace("\tGetChildrenList() ignored"); + return false; + } + eval("\$childInstance->Set".$thisObjectName."(\$object);"); + + $childInstance->Save(); + + + + //try getting all children + eval ("\$children = \$object -> Get".$child."List();"); + if (sizeof($children) != 1) + { + AddTrace("\tGet".$child."List() failed"); + AddError("Could not get children list"); + $errors++; + } + + //cleanup + $childInstance->Delete(); + + if ($errors == 0 && $trace) + { + AddTrace("\tGet".$child."List()....OK!"); + } + } + + $object->Delete(false); + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit Test for SetChildrenList + * + * @param unknown_type $object + * @param unknown_type $trace + * @return unknown + */ + function TestSetChildrenList($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + if (!TestSaveDeep_Child($object, false, $ignoreObjects)) + { + AddTrace("\tSetChildrenList(deep) ignored"); + AddError("SetChildrenList ignored since SaveDeep could not be performed"); + return false; + } + + //get all child classes + $childrenList = array(); + eval("\$object = new $thisObjectName();"); + $object = PopulateTestValues($object); + $attribute_types = $object->pog_attribute_type; + + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "HASMANY") + { + $childrenList[] = $key; + } + } + + $errors = 0; + foreach ($childrenList as $child) + { + //instantiate + $childInstanceList = array(); + eval("\$childInstance = new $child();"); + eval("\$childInstance2 = new $child();"); + $childInstance = PopulateTestValues($childInstance); + $childInstance2 = PopulateTestValues($childInstance2); + + //add children to array + $childInstanceList[] = $childInstance; + $childInstanceList[] = $childInstance2; + + eval ("\$object -> Set".$child."List(\$childInstanceList);"); + } + + //test + if (!$object->Save(true)) + { + $errors++; + return false; + } + + foreach ($childrenList as $child) + { + //instantiate + eval("\$childArray = \$object->Get".$child."List();"); + if (sizeof($childArray) == 0) + { + AddTrace("\tSet($child)List failed"); + $errors++; + } + else + { + AddTrace("\tSet($child)List....OK!"); + } + } + + //cleanup + $object->Delete(true); + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit Test for AddSibling() + * + * @param unknown_type $object + * @param unknown_type $trace + * @return unknown + */ + function TestAddSibling($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + eval ("\$object = new $thisObjectName();"); + $attribute_types = $object->pog_attribute_type; + + $object = PopulateTestValues($object); + + //get all sibling classes + $siblingList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "JOIN") + { + $siblingList[] = $key; + } + } + + $errors = 0; + foreach ($siblingList as $sibling) + { + //instantiate + eval ("\$siblingInstance = new $sibling();"); + $siblingInstance = PopulateTestValues($siblingInstance); + + //instantiate other + eval("\$siblingInstance2 = new $sibling();"); + $siblingInstance2 = PopulateTestValues($siblingInstance2); + + //add sibling + eval ("\$object -> Add$sibling(\$siblingInstance);"); + eval ("\$object -> Add$sibling(\$siblingInstance2);"); + + //verify that slbings were added + eval ("\$siblings = \$object->".strtolower($sibling)."List;"); + + if (sizeof($siblings) != 2) + { + if ($trace) + { + AddTrace("\tAdd$sibling() failed"); + AddError("Could not add sibling object $sibling"); + } + $errors++; + } + else + { + if ($trace) + { + AddTrace("\tAdd$sibling()....OK!"); + } + } + } + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for GetSiblingList() + * + * @param unknown_type $object + * @param unknown_type $trace + * @return unknown + */ + function TestGetSiblingList($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + eval ("\$object = new $thisObjectName();"); + $attribute_types = $object->pog_attribute_type; + $errors = 0; + + //get all sibling classes + $siblingList = array(); + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "JOIN") + { + $siblingList[] = $key; + } + } + + $object = PopulateTestValues($object); + + $siblingsStore = array(); + + foreach ($siblingList as $sibling) + { + //instantiate + eval("\$siblingInstance = new $sibling();"); + $siblingsStore[] = $siblingInstance; + $siblingInstance = PopulateTestValues($siblingInstance); + + if (!TestAddSibling($siblingInstance, false, $ignoreObjects)) + { + if ($trace) + { + AddTrace("\tGetSiblingList() ignored"); + } + return false; + } + eval("\$object->Add".$sibling."(\$siblingInstance);"); + + } + + $object->Save(); + + foreach ($siblingList as $sibling) + { + + //try getting all siblings + eval ("\$siblings = \$object -> Get".$sibling."List();"); + if (sizeof($siblings) != 1) + { + if ($trace) + { + AddTrace("\tGet".$sibling."List() failed"); + AddError("Could not get sibling list"); + } + $errors++; + } + else if ($trace) + { + AddTrace("\tGet".$sibling."List()....OK!"); + } + } + + foreach ($siblingsStore as $stored) + { + $stored->Delete(); + } + + $object->Delete(false); + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Unit test for SetSiblingList() + * + * @param unknown_type $object + * @param unknown_type $trace + */ + function TestSetSiblingList($object, $trace = true, $ignoreObjects) + { + $thisObjectName = get_class($object); + if (!TestSaveDeep_Sibling($object, false, $ignoreObjects)) + { + AddTrace("\tSetSiblingList(deep) ignored"); + AddError("SetSiblingList ignored since SaveDeep could not be performed"); + return false; + } + + //get all sibling classes + $siblingList = array(); + eval("\$object = new $thisObjectName();"); + $object = PopulateTestValues($object); + $attribute_types = $object->pog_attribute_type; + + foreach ($attribute_types as $key => $attribute_array) + { + if ($attribute_array['db_attributes'][1] == "JOIN") + { + $siblingList[] = $key; + } + } + + $errors = 0; + foreach ($siblingList as $sibling) + { + //instantiate + $siblingInstanceList = array(); + eval("\$siblingInstance = new $sibling();"); + eval("\$siblingInstance2 = new $sibling();"); + $siblingInstance = PopulateTestValues($siblingInstance); + $siblingInstance2 = PopulateTestValues($siblingInstance2); + + //add sibling to array + $siblingInstanceList[] = $siblingInstance; + $siblingInstanceList[] = $siblingInstance2; + + eval ("\$object -> Set".$sibling."List(\$siblingInstanceList);"); + } + + //test + if (!$object->Save(true)) + { + $errors++; + return false; + } + + foreach ($siblingList as $sibling) + { + //instantiate + eval("\$siblingArray = \$object->Get".$sibling."List();"); + if (sizeof($siblingArray) == 0) + { + if ($trace) + { + AddTrace("\tSet($sibling)List failed"); + } + $errors++; + } + else if ($trace) + { + AddTrace("\tSet($sibling)List....OK!"); + } + } + + //cleanup + $object->Delete(false, true); + + if ($errors == 0) + { + return true; + } + return false; + } + + /** + * Creates the mapping name + * + * @param unknown_type $objectName1 + * @param unknown_type $objectName2 + * @return unknown + */ + function MappingName($objectName1, $objectName2) + { + $array = array($objectName1, $objectName2); + sort($array); + return implode($array)."Map"; + } + + /** + * Gets total no. of records; + */ + function GetNumberOfRecords($objectName) + { + $sql = 'select count(*) from `'.strtolower($objectName)."`"; + $connection = Database::Connect(); + $cursor = Database::Reader($sql, $connection); + if ($cursor !== false) + { + while($row = Database::Read($cursor)) + { + return $row['count(*)']; + } + } + return 0; + } +?> \ No newline at end of file diff --git a/backend/php/src/setup/setup_library/upgrade.php b/backend/php/src/setup/setup_library/upgrade.php new file mode 100644 index 0000000..122da58 --- /dev/null +++ b/backend/php/src/setup/setup_library/upgrade.php @@ -0,0 +1,140 @@ + 4 && substr(strtolower($file), strlen($file) - 4) === '.php' && !is_dir($file) && $file != "class.database.php" && $file != "configuration.php" && $file != "setup.php" && $file != "class.pog_base.php") + { + $objects[] = $file; + } + } + closedir($dir); + $i = 0; + foreach($objects as $object) + { + $content = file_get_contents($path."/".$object); + $contentParts = split("",$content); + if (isset($contentParts[1])) + { + $contentParts2 = split("",$contentParts[1]); + } + if (isset($contentParts2[0])) + { + $className = trim($contentParts2[0]); + } + if (isset($className)) + { + eval ('include_once("../../objects/class.'.strtolower($className).'.php");'); + $instance = new $className(); + if (!TestIsMapping($instance)) + { + $objectNameList[] = $className; + + $linkParts1 = split("\*\/", $contentParts[1]); + $linkParts2 = split("\@link", $linkParts1[0]); + $link = $linkParts2[1]; + $options = false; + if ($GLOBALS['configuration']['proxy_host'] != false && + $GLOBALS['configuration']['proxy_port'] != false && + $GLOBALS['configuration']['proxy_username'] != false && + $GLOBALS['configuration']['proxy_password'] != false) + { + $options = array( + 'proxy_host' => $GLOBALS['configuration']['proxy_host'], + 'proxy_port' => $GLOBALS['configuration']['proxy_port'], + 'proxy_login' => $GLOBALS['configuration']['proxy_username'], + 'proxy_password' => $GLOBALS['configuration']['proxy_password'] + ); + } + $client = new SoapClient( + $GLOBALS['configuration']['soap'], + $options) ; + if ($i == 0) + { + $package = unserialize($client->GeneratePackageFromLink($link)); + } + else + { + $objectString = $client->GenerateObjectFromLink($link); + $package["objects"]["class.".strtolower($className).".php"] = $objectString; + } + } + } + $i++; + } + + + //upgrade mapping classes if any + foreach ($objectNameList as $objectName) + { + $instance = new $objectName(); + foreach ($instance->pog_attribute_type as $key => $attribute_type) + { + if ($attribute_type['db_attributes'][1] == "JOIN") + { + $mappingString = $client->GenerateMapping($objectName, $key, (isset($GLOBALS['configuration']['pdoDriver']) ? 'php5.1' :'php5'), (isset($GLOBALS['configuration']['pdoDriver']) ? 'pdo' :'pog'), (isset($GLOBALS['configuration']['pdoDriver']) ? 'mysql' :'')); + $package["objects"]['class.'.strtolower(MappingName($objectName, $key)).'.php'] = $mappingString; + } + } + } + + $zipfile = new createZip(); + $zipfile -> addPOGPackage($package); + $zipfile -> forceDownload("pog.".time().".zip"); + } + + /** + * Checks if POG generator has been updated + * + * @return unknown + */ + function UpdateAvailable() + { + $client = new SoapClient($GLOBALS['configuration']['soap']); + $generatorVersion = base64_decode($client -> GetGeneratorVersion()); + if ($generatorVersion != $GLOBALS['configuration']['versionNumber'].$GLOBALS['configuration']['revisionNumber']) + { + return true; + } + else + { + return false; + } + } + + if (UpdateAvailable()) + { + UpdateAllObjects("../../objects/"); + } + else + { + echo ""; + } +?> \ No newline at end of file diff --git a/backend/php/src/setup/setup_library/xPandMenu.css b/backend/php/src/setup/setup_library/xPandMenu.css new file mode 100644 index 0000000..744debe --- /dev/null +++ b/backend/php/src/setup/setup_library/xPandMenu.css @@ -0,0 +1,55 @@ +#container { + width:500px; + background-color:#E7E9EE; +} +.Xtree, .XtreeRoot { + list-style-type:none; + margin:15px 20px; +} +.Xtree { + /* Indentation of a sub-item compared to its parent */ + padding-left:25px; + margin-left:3px; + border-left:1px dotted #998D05; + width:100%; +} +.Xnode { + /* Top and bottom space for a node item */ + margin-top:-3px;margin-bottom:3px; + /* Height of the node item */ + height:20px; + /* Node background color */ + background:#E7E9EE; + /* Font specifications for a node */ + font-weight:bold; + font-size:10px; + cursor:pointer; + vertical-align:middle; + width:100%; +} +.Xnode img{ vertical-align:middle; } +.Xleaf { + /* Top and bottom space for a leaf item */ + margin-top:-10px;margin-bottom:1px; + /* Height of the leag item */ + /* Leaf background color */ + /* Font specifications for a leaf */ + font-weight:normal; + font-size:10px; + padding:2px; +} +.Xnode a { + text-decoration:none; +} +.Xnode a:hover { + color:red; + text-decoration:underline; +} +.Xleaf a { + text-decoration:none; +} +.Xleaf a:hover { + color:red; + text-decoration:none; + background:#eee; +} \ No newline at end of file diff --git a/backend/php/src/setup/setup_library/xPandMenu.js b/backend/php/src/setup/setup_library/xPandMenu.js new file mode 100644 index 0000000..7f9a632 --- /dev/null +++ b/backend/php/src/setup/setup_library/xPandMenu.js @@ -0,0 +1,273 @@ +/******************************** +* xPandMenu MULTI-LEVEL class +********************************* +* Javascript file +********************************* +* Patrick Brosset +* patrickbrosset@gmail.com +********************************* +* 02/2005 +*********************************/ + + +// Show / hide a sub-menu +function xMenuShowHide(obj) +{ + + if(obj.style.display == 'none'){ + obj.style.display = 'block'; + }else{ + obj.style.display = 'none'; + } + +} + + +// Toggle expanded / collapsed versions of items' images +function xSwapImg(imgDiv,srcImg,srcAltImg){ + + /* Update by Christian Vallee + ==> No need to specify absolute URL for images anymore, this feature will find it on its own */ + + // looking for the images' root URL based on the current image + var str = imgDiv.src; + var pos = str.search(srcImg); + // if the URL root wasn't found using the first image, try with the alternative one + if ( pos == -1 ) { pos = str.search(srcAltImg); } + // extracting the URL root + var root = str.substring(0,pos); + // adding the root the image path supplied + srcImg = root.concat(srcImg); + srcAltImg = root.concat(srcAltImg); + + /* End Update */ + + if(imgDiv.src == srcImg){ + imgDiv.src = srcAltImg; + }else{ + imgDiv.src = srcImg; + } + +} + + +// Restore the menu state when the page loads +function xRestoreState() +{ + //restore list state + var name = "xMenuState"; + var start = document.cookie.indexOf(name+"="); + if(start != -1) + { + var len = start+name.length+1; + if ((!start) && (name != document.cookie.substring(0,name.length))) return null; + if (start == -1) return null; + var end = document.cookie.indexOf(";",len); + if (end == -1) end = document.cookie.length; + var value = unescape(document.cookie.substring(len,end)); + var values = value.split("|"); + for(i=0;i>"); + var imgs = couple[1].split(","); + for(var il in imgs) + { + document.getElementById(imgs[il]).src = couple[0]; + } + } + } +} + +//Get the ids of all open nodes +function getOpenNodes() +{ + value = new Array(); + var myLists = document.getElementsByTagName("UL"); + for(i=0;i>" + value[imgPath] + "[]"; + } + var cook = str.substring(0,str.length-2); + document.cookie = "xMenuStateImg=" + escape(cook) + ";"; +} + +function createRequestObject() +{ + var ro; + if (window.XMLHttpRequest) + { + ro = new XMLHttpRequest(); + } + else + { + ro = new ActiveXObject('MSXML2.XMLHTTP.3.0'); + } + return ro; +} + +var http = createRequestObject(); + +function refTree(offset, limit, objectName) +{ + http = createRequestObject(); + var req = './rpc.php?action=Refresh&offset='+offset+'&limit='+limit+'&objectname='+objectName; + http.open('get', req); + http.onreadystatechange = handleResponse; + http.send(null); +} + +function sndReq(action, openNodes, objectName, objectId, currentNode, attributes, anchor) +{ + + + http = createRequestObject(); + var req = './rpc.php?action='+action+'&opennodes='+openNodes+'&objectname='+objectName+'&objectid='+objectId+'¤tnode='+currentNode+'&anchor='+anchor; + if (action == "Add") + { + for (i=0; iindent = 0; + $this->first = true; + $this->treeCount = 0; + $this->imgCount = 0; + $this->output = ""; + } + + + + // addItem, adds a child to this menu + // Takes a XNode object reference as argument + function &addItem(&$node) + { + $this->items[] = &$node; + return $this->items[count($this->items) - 1]; + } + + + + // generateTree, generates the HTML code (UL list) for the dynamic tree-view + function generateTree($root = false) + { + if(!$root) $root = $this; + + if($this->first){ + $this->output .= $this->codeIndent()."
    \n"; + $this->first = false; + }else{ + if (array_search($this->treeCount, $this->visibleNodes) !== false) + { + $this->output .= $this->codeIndent()."
      treeCount."\" class=\"Xtree\" style=\"display:block;\">\n"; + } + else + { + $this->output .= $this->codeIndent()."
        treeCount."\" class=\"Xtree\" style=\"display:none;\">\n"; + } + } + $this->treeCount ++; + foreach($root->items as $myChild){ + $this->imgCount ++; + if($myChild->img){ + if($myChild->alt_img){ + $img_js = "xSwapImg(document.getElementById('Ximg".$this->imgCount."'),'".$myChild->img."','".$myChild->alt_img."');"; + }else{ + $img_js = ""; + } + if (array_search($this->treeCount, $this->visibleNodes) !== false) + { + $img = "treeCount."'));\" id=\"Ximg".$this->imgCount."\" src=\"".$myChild->alt_img."\" border=\"0\">  "; + } + else + { + $img = "treeCount."'));\" id=\"Ximg".$this->imgCount."\" src=\"".$myChild->img."\" border=\"0\">  "; + } + }else{ + $img = "";$img_js = ""; + } + if($myChild->link){ + $href_open = "link."\">"; + $href_close = ""; + }else{ + $href_open = ""; + $href_close = ""; + } + if(count($myChild->items) != 0){ + $this->output .= $this->codeIndent()."
      • treeCount."\">
        ".$href_open.$img.$myChild->name.$href_close."
      • \n"; + $this->indent ++; + $this->generateTree($myChild); + }else{ + $this->output .= $this->codeIndent()."
      • ".$href_open.$img.$myChild->name.$href_close."
      • \n"; + } + } + $this->output .= $this->codeIndent()."
      \n"; + $this->indent --; + + return $this->output; + } + + + + // saveTree and restoreTree - thanks to Niels Fanoe (niels.f@noee.dk) for giving me the idea + + // saveTree, save the generated HTML code to a file for future use without generating again + function saveTree($filename = "xMenuCache.html") + { + $file = new File(); + $file->write($this->output,$filename); + $file->printError(); + return $filename; + } + + + + // restoreTree, returns the previously generated HTML code stored in a file + // Call this method STATICALLY for easier use: XMenu::restoreTree("xPandMenuCode.html"); + function restoreTree($filename = "xMenuCache.html") + { + $file = new File(); + $menu = $file->read($filename); + $error = $file->getError(); + if(!empty($error)) return false; + else return $menu; + } + + + + // codeIndent, only used to create a nice and readable HTML code (indents the UL and LI tags) + function codeIndent() + { + $str = ""; + for($i=0;$i<$this->indent;$i++){ + $str .= " "; + } + return $str; + } + + +} + + + + +// XNode class: A node item in the menu +class XNode +{ + + + // Name assigned to this node (Text shown on the item) + var $name; + + // Link for the item (if any) + var $link; + + // Sub-items of this node + var $items = array(); + + // Absolute URL of this node's icon + var $img; + + // Absolute URL of this node's icon (alternate, used for expanded and collapsed states) + var $alt_img; + + + + // constructor + // $name: text shown for this item + // $link: where does this item links to when clicked (optional) + // $img and $alt_img: images displayed next to this item (absolute paths to images must be used) + function XNode($name,$link = false,$img = LEAF_DEFAULT_IMG,$alt_img = LEAF_DEFAULT_ALT_IMG) + { + $this->name = $name; + $this->link = $link; + $this->img = $img; + $this->alt_img = $alt_img; + } + + + + // addItem, adds a subnode under this node + // Takes a XNode object reference as argument + function &addItem(&$node) + { + if($this->img == LEAF_DEFAULT_IMG){$this->img = NODE_DEFAULT_IMG;} + if($this->alt_img == LEAF_DEFAULT_ALT_IMG){$this->alt_img = NODE_DEFAULT_ALT_IMG;} + $this->items[] = &$node; + return $this->items[count($this->items) - 1]; + } + + + +} + +?> \ No newline at end of file diff --git a/backend/php/src/test.php b/backend/php/src/test.php new file mode 100644 index 0000000..827ee66 --- /dev/null +++ b/backend/php/src/test.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/backend/python/properties/python.properties.json b/backend/python/properties/python.properties.json new file mode 100644 index 0000000..e69de29 diff --git a/backend/python/src/app.yaml b/backend/python/src/app.yaml new file mode 100644 index 0000000..5e085a9 --- /dev/null +++ b/backend/python/src/app.yaml @@ -0,0 +1,20 @@ +application: clipperz +version: 1 +runtime: python +api_version: 1 + +handlers: +- url: /json + script: clipperz.py + +- url: /css + static_dir: css + +- url: /js + static_dir: js + +- url: /images + static_dir: images + +- url: /.* + script: clipperz.py diff --git a/backend/python/src/clipperz.py b/backend/python/src/clipperz.py new file mode 100644 index 0000000..c8d91de --- /dev/null +++ b/backend/python/src/clipperz.py @@ -0,0 +1,708 @@ +# +# Copyright 2008-2011 Clipperz Srl +# +# This file is part of Clipperz's Javascript Crypto Library. +# Javascript Crypto Library provides web developers with an extensive +# and efficient set of cryptographic functions. The library aims to +# obtain maximum execution speed while preserving modularity and +# reusability. +# For further information about its features and functionalities please +# refer to http://www.clipperz.com +# +# * Javascript Crypto Library 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. +# +# * Javascript Crypto Library is distributed in the hope that it will +# be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU Affero General Public License for more details. +# +# * You should have received a copy of the GNU Affero General Public +# License along with Javascript Crypto Library. If not, see +# . +# + +import os +import cgi +import wsgiref.handlers + +import datetime +import uuid +import random +import hashlib + +import logging + +from google.appengine.api import users +from google.appengine.ext import webapp +from google.appengine.ext import db +from google.appengine.ext.webapp import template + +from django.utils import simplejson + +#============================================================================== + +sessionTimeout = datetime.timedelta(minutes=-2) + +def randomSeed(): + return hex(random.getrandbits(32*8))[2:-1] + +def clipperzHash(aString): + #logging.info(">>> string: " + aString) + firstRound = hashlib.sha256() + firstRound.update(aString) + #logging.info("firstRound: " + firstRound.hexdigest() + " - " + firstRound.digest()) + result = hashlib.sha256() + result.update(firstRound.digest()) + #logging.info("<<< finalResul: " + result.hexdigest()) + + return result.hexdigest() + +#============================================================================== + +class User(db.Model): + username = db.StringProperty() + srp_s = db.StringProperty() + srp_v = db.StringProperty() + header = db.TextProperty() + statistics = db.TextProperty() + auth_version= db.StringProperty() + version = db.StringProperty() + lock = db.StringProperty() + + def updateCredentials(self, someCredentials): + self.username = someCredentials['C'] + self.srp_s = someCredentials['s'] + self.srp_v = someCredentials['v'] + self.auth_version = someCredentials['version'] + + def update(self, someData): + self.header = someData['header'] + self.statistics = someData['statistics'] + self.version = someData['version'] + self.lock = someData['lock'] + +#------------------------------------------------------------------------------ + +class Record(db.Model): + user = db.ReferenceProperty(User) + reference = db.StringProperty() + data = db.TextProperty() + version = db.StringProperty() + creation_date = db.DateTimeProperty(auto_now_add=True) + update_date = db.DateTimeProperty(auto_now_add=True) + access_date = db.DateTimeProperty(auto_now_add=True) + +#------------------------------------------------------------------------------ + +class RecordVersion(db.Model): + record = db.ReferenceProperty(Record) + reference = db.StringProperty() + header = db.TextProperty() + data = db.TextProperty() + version = db.StringProperty() + previousVersionKey = db.StringProperty() + previousVersion = db.SelfReferenceProperty() + creation_date = db.DateTimeProperty(auto_now_add=True) + update_date = db.DateTimeProperty(auto_now_add=True) + access_date = db.DateTimeProperty(auto_now_add=True) + + def update(self, someData): + recordData = someData['record']; + self.parent().reference = recordData['reference'] + self.parent().data = recordData['data'] + self.parent().version = recordData['version'] + self.parent().update_date = datetime.datetime.now() + + recordVersionData = someData['currentRecordVersion']; + self.reference = recordVersionData ['reference'] + self.data = recordVersionData ['data'] + self.version = recordVersionData ['version'] + #self.previous_version = #recordVersionData ['previousVersion'] + self.previous_version_key = recordVersionData ['previousVersionKey'] + self.update_date = datetime.datetime.now() + +#------------------------------------------------------------------------------ + +class OneTimePassword(db.Model): + user = db.ReferenceProperty(User) + status = db.StringProperty() + reference = db.StringProperty() + keyValue = db.StringProperty() + keyChecksum = db.StringProperty() + data = db.TextProperty() + version = db.StringProperty() + creation_date = db.DateTimeProperty(auto_now_add=True) + request_date = db.DateTimeProperty() + usage_date = db.DateTimeProperty() + + def update(self, someParameters, aStatus): + self.reference = someParameters['reference'] + self.keyValue = someParameters['key'] + self.keyChecksum = someParameters['keyChecksum'] + self.data = someParameters['data'] + self.version = someParameters['version'] + self.status = aStatus + + def reset(self, aStatus): + self.data = "" + self.status = aStatus + + return self + +#------------------------------------------------------------------------------ + +class Session(db.Expando): + sessionId = db.StringProperty() + access_date = db.DateTimeProperty() + +#============================================================================== + +class MainPage(webapp.RequestHandler): + def get(self): + path = os.path.join(os.path.dirname(__file__), 'static%s' % self.request.path) + self.response.out.write(template.render(path, {})) + +#============================================================================== + +class XHR(webapp.RequestHandler): + + #========================================================================== + + def get(self): + logging.info("self.request.path: " + self.request.path) + if self.request.path == "/dump": + session = self.getSession() + userData = {} + offline_data_placeholder = "" + + user = db.Query(User).filter('username =', session.C).get() + + userData['users'] = { + 'catchAllUser': { + '__masterkey_test_value__': 'masterkey', + 's': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + 'v': '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + } + } + + records = {} + for currentRecord in db.Query(Record).ancestor(user): + versions = {} + for currentVersion in db.Query(RecordVersion).ancestor(currentRecord): + versions[currentVersion.reference] ={ + 'header': currentVersion.header, + 'data': currentVersion.data, + 'version': currentVersion.version, + 'creationDate': str(currentVersion.creation_date), + 'updateDate': str(currentVersion.update_date), + 'accessDate': str(currentVersion.access_date) + } + + records[currentRecord.reference] = { + 'data': currentRecord.data, + 'version': currentRecord.version, + 'creationDate': str(currentRecord.creation_date), + 'updateDate': str(currentRecord.update_date), + 'accessDate': str(currentRecord.access_date), + 'currentVersion': currentVersion.reference, + 'versions': versions + } + + userData['users'][user.username] = { + 's': user.srp_s, + 'v': user.srp_v, + 'version': user.auth_version, + 'maxNumberOfRecords': '100', + 'userDetails': user.header, + 'statistics': user.statistics, + 'userDetailsVersion': user.version, + 'records': records + } + + offline_data_placeholder = offline_data_placeholder + "_clipperz_dump_data_ = " + simplejson.dumps(userData, indent=4) + "\n" + offline_data_placeholder = offline_data_placeholder + "Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.Offline();" + "\n" + offline_data_placeholder = offline_data_placeholder + "Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();" + "\n" + + path = os.path.join(os.path.dirname(__file__), 'static/dump.html') + + self.response.headers.add_header('Content-Type', 'text/html') + self.response.headers.add_header('Content-Disposition', 'attachment', filename='Clipperz.html') + self.response.out.write(template.render(path, {'offline_data_placeholder': offline_data_placeholder})) + + #========================================================================== + + def post(self): + method = self.request.get('method') + parameters = simplejson.loads(self.request.get('parameters')) + session = self.getSession() + result = {}; + + #---------------------------------------------------------------------- + + if method == 'registration': + message = parameters['message']; + + if message == 'completeRegistration': + user = User() + + user.updateCredentials(parameters['credentials']) + user.update(parameters['user']) + user.put() + + result['lock'] = user.lock + result['result'] = "done" + + #---------------------------------------------------------------------- + + elif method == 'handshake': + srp_g = 2L + srp_n = long("0x%s" % "115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16) + + message = parameters['message']; + + #------------------------------------------------------------------ + + if message == 'connect': + session.C = parameters['parameters']['C'] + session.A = parameters['parameters']['A'] + + user = db.Query(User).filter('username =', session.C).get() + + if user != None: + try: + optId = session.otpId + + oneTimePassword = db.Query(OneTimePassword).filter('keyValue =', optId).get() + + if oneTimePassword.parent().username != user.username: + oneTimePassword.reset('DISABLED').put() + raise Exception, "User missmatch between the current session and 'One Time Password' user" + elif oneTimePassword.status != 'REQUESTED': + oneTimePassword.reset('DISABLED').put() + raise Exception, "Tring to use an 'One Time Password' in the wrong state" + + oneTimePassword.reset("USED").put() + + result['oneTimePassword'] = oneTimePassword.reference + + except Exception, detail: + logging.error("connect.optId: " + str(detail)) + + session.s = user.srp_s + session.v = user.srp_v + else: + session.s = "112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00" + session.v = "112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00" + + session.b = randomSeed() + session.B = hex(long("0x%s" % session.v, 16) + pow(srp_g, long("0x%s" %session.b, 16), srp_n))[2:-1] + + result['s'] = session.s + result['B'] = session.B + + #------------------------------------------------------------------ + + elif message == 'credentialCheck': + B = long("0x%s" % session.B, 16) + b = long("0x%s" % session.b, 16) + A = long("0x%s" % session.A, 16) + v = long("0x%s" % session.v, 16) + u = long("0x%s" % clipperzHash(str(B)), 16) + n = srp_n + + S = pow((A * pow(v, u, n)), b, n) + K = clipperzHash(str(S)) + M1 = clipperzHash(str(A) + str(B) + K) + + if M1 == parameters['parameters']['M1']: + session.K = K + M2 = clipperzHash(str(A) + M1 + K) + + result['M2'] = M2 + result["connectionId"] = "" + result["loginInfo"] = {} + result["loginInfo"]["latest"] = {} + result["loginInfo"]["current"] = {} + result["offlineCopyNeeded"] = "false"; + result["lock"] = "----"; + else: + result['error'] = "?" + + #------------------------------------------------------------------ + + elif message == 'oneTimePassword': + oneTimePassword = db.Query(OneTimePassword).filter("keyValue =", parameters["parameters"]["oneTimePasswordKey"]).get() + + if oneTimePassword != None: + if oneTimePassword.status == 'ACTIVE': + if oneTimePassword.keyChecksum == parameters['parameters']['oneTimePasswordKeyChecksum']: + #session.userId = str(oneTimePassword.parent().username) + session.otpId = str(oneTimePassword.keyValue) + + result['data'] = oneTimePassword.data + result['version'] = oneTimePassword.version + + oneTimePassword.reset('REQUESTED').put() + + else: + oneTimePassword.reset('DISABLED').put() + raise Exception, "The requested One Time Password has been disabled, due to a wrong keyChecksum" + else: + raise Exception, "The requested One Time Password was not active" + else: + raise Exception, "The requested One Time Password has not been found" + + #---------------------------------------------------------------------- + + elif method == 'message': + if parameters['srpSharedSecret'] == session.K: + message = parameters['message'] + + if message == 'getUserDetails': + # {"message":"getUserDetails", "srpSharedSecret":"f18e5cf7c3a83b67d4db9444af813ee48c13daf4f8f6635397d593e52ba89a08", "parameters":{}} + user = db.Query(User).filter('username =', session.C).get() + + result['header'] = user.header; + result['statistics'] = user.statistics; + result['version'] = user.version; + + elif message == "addNewRecords": + user = db.Query(User).filter('username =', session.C).get() + result = db.run_in_transaction(self.addNewRecords, session, user, parameters) + + """ + user = db.Query(User).filter('username =', session.C).get() + user.update(parameters['parameters']['user']) + + for recordParameter in parameters['parameters']['records']: + record = Record(parent=user) + record.put() + recordVersion = RecordVersion(parent=record) + recordVersion.put() + + recordVersion.update(recordParameter) + + record.put() + recordVersion.put() + + user.put(); + + result['lock'] = user.lock + result['result'] = 'done' + """ + + elif message == 'getRecordDetail': + record = db.Query(Record).ancestor(db.Query(User).filter('username =', session.C).get()).filter('reference =', parameters["parameters"]["reference"]).get() + recordVersion = db.Query(RecordVersion).ancestor(record).get() + + result['currentVersion'] = {} + result['currentVersion']['reference'] = recordVersion.reference + result['currentVersion']['data'] = recordVersion.data + result['currentVersion']['header'] = recordVersion.header + result['currentVersion']['version'] = recordVersion.version + result['currentVersion']['creationDate'] = str(recordVersion.creation_date) + result['currentVersion']['updateDate'] = str(recordVersion.update_date) + result['currentVersion']['accessDate'] = str(recordVersion.access_date) + + result['reference'] = record.reference + result['data'] = record.data + result['version'] = record.version + result['creationDate'] = str(record.creation_date) + result['updateDate'] = str(record.update_date) + result['accessDate'] = str(record.access_date) + result['oldestUsedEncryptedVersion'] = "---" + + elif message == 'updateData': + user = db.Query(User).filter('username =', session.C).get() + user.update(parameters['parameters']['user']) + + for recordParameter in parameters['parameters']['records']: + logging.info('reference =' + recordParameter['record']['reference']) + record = db.Query(Record).ancestor(user).filter('reference =', recordParameter['record']['reference']).get() + recordVersion = db.Query(RecordVersion).ancestor(record).get() + + recordVersion.update(recordParameter) + + recordVersion.put() + recordVersion.parent().put() + + user.put(); + + result['lock'] = user.lock + result['result'] = 'done' + + elif message == 'deleteRecords': + user = db.Query(User).filter('username =', session.C).get() + user.update(parameters['parameters']['user']) + + for recordReference in parameters['parameters']['recordReferences']: + record = db.Query(Record).ancestor(user).filter('reference =', recordReference).get() + #recordVersion = db.Query(RecordVersion).ancestor(record).get() + + db.delete(db.Query(RecordVersion).ancestor(record)) + record.delete() + + user.put() + + result['lock'] = user.lock + result['result'] = 'done' + + elif message == 'deleteUser': + user = db.Query(User).filter('username =', session.C).get() + db.delete(db.Query(RecordVersion).ancestor(user)) + db.delete(db.Query(Record).ancestor(user)) + user.delete() + + elif message == 'addNewOneTimePassword': + user = db.Query(User).filter('username =', session.C).get() + user.update(parameters['parameters']['user']) + + oneTimePassword = OneTimePassword(parent=user) + oneTimePassword.update(parameters['parameters']['oneTimePassword'], "ACTIVE") + oneTimePassword.put() + + user.put() + + result['lock'] = user.lock + result['result'] = 'done' + + elif message == 'updateOneTimePasswords': + user = db.Query(User).filter('username =', session.C).get() + user.update(parameters['parameters']['user']) + + validOtpReferences = parameters['parameters']['oneTimePasswords'] + for currentOtp in db.Query(OneTimePassword).ancestor(user): + if currentOtp.reference in validOtpReferences: + pass + else: + currentOtp.delete() + + user.put() + + result['result'] = user.lock + + elif message == 'getOneTimePasswordsDetails': + pass + + elif message == 'getLoginHistory': + result["result"] = [] + + elif message == 'upgradeUserCredentials': + user = db.Query(User).filter('username =', session.C).get() + + user.updateCredentials(parameters['parameters']['credentials']) + user.update(parameters['parameters']['user']) + + for oneTimePasswordReference in parameters['parameters']['oneTimePasswords']: + oneTimePassword = db.Query(OneTimePassword).ancestor(user).filter("reference =", oneTimePasswordReference).get() + + if oneTimePassword != None: + oneTimePassword.data = parameters['parameters']['oneTimePasswords'][oneTimePasswordReference] + oneTimePassword.put() + + user.put() + + result['lock'] = user.lock + result['result'] = 'done' + + """ + $user = new user(); + $user->Get($_SESSION["userId"]); + + $otp = new onetimepassword(); + + updateUserCredentials($parameters["parameters"]["credentials"], $user); + updateUserData($parameters["parameters"]["user"], $user); + + $otpList = $parameters["parameters"]["oneTimePasswords"]; + foreach($otpList as $otpReference=>$otpData) { + $otpList = $otp->GetList(array(array("reference", "=", $otpReference))); + $currentOtp = $otpList[0]; + $currentOtp->data = $otpData; + $currentOtp->Save(); + } + + $user->Save(); + + $result["lock"] = $user->lock; + $result["result"] = "done"; + """ + + #============================================================= + + """ + java.util.Map result; + + try { + java.util.Map credentials; + + if (someParameters.get("credentials") != null) { + credentials = (java.util.Map)someParameters.get("credentials"); + } else { + credentials = someParameters; + } + + aUser.setUsername((java.lang.String)credentials.get("C")); + aUser.setSrpS((java.lang.String)credentials.get("s")); + aUser.setSrpV((java.lang.String)credentials.get("v")); + aUser.setVersion((java.lang.String)credentials.get("version")); + + if (someParameters.get("user") != null) { + com.clipperz.dataModel.EncoderHelper.updateWithMap(aUser, (java.util.Map)someParameters.get("user")); + } + + if (someParameters.get("oneTimePasswords") != null) { + java.util.Map updatedOneTimePasswords; + java.util.List usersOneTimePasswords; + int i,c; + + updatedOneTimePasswords = (java.util.Map)someParameters.get("oneTimePasswords"); + usersOneTimePasswords = com.clipperz.dataModel.OneTimePassword.oneTimePasswordsForUser(this.user()); + c = usersOneTimePasswords.size(); + for (i=0; i>> getSession (%d) => %s" % (db.Query(Session).count(), str(map(lambda v: v.sessionId, db.Query(Session).fetch(100)))) ) + result = None + try: + sessionId = self.request.cookies['sessionId'] + except: + sessionId = None + + #logging.info("wannabe sessionId: " + str(sessionId)) + + if sessionId != None: + #query = db.Query(Session) + #query.filter('sessionId =', sessionId) + + #result = query.get() + + #result = db.Query(Session).filter('sessionId =', str(sessionId)).filter('access_date >', (datetime.datetime.utcnow() - sessionTimeout)).get() + result = db.Query(Session).filter('sessionId =', str(sessionId)).get() + #logging.info("searching session on datastore. Found: " + str(result)) + + if result == None: + sessionId = str(uuid.uuid4()) + #logging.info("creating a new session with sessionId=" + str(sessionId)) + result = Session(sessionId=sessionId) + + result.access_date = datetime.datetime.utcnow() + result.put() + + #logging.info("<<< getSession (%d)" % db.Query(Session).count()) + + return result + + #========================================================================== + + def saveSession(self, aSession): + #logging.info(">>> saveSession (%d)" % db.Query(Session).count()) + #self.response.set_cookie('sessionId', aSession.sessionId, max_age=360, path='/', domain='example.org', secure=True) + aSession.put() + self.response.headers.add_header('Set-Cookie', 'sessionId=' + str(aSession.sessionId), path='/') + self.cleanOldSessions() + #logging.info("<<< saveSession (%d)" % db.Query(Session).count()) + + #========================================================================== + + def cleanOldSessions(self): + query = db.Query(Session).filter('accessDate <', (datetime.datetime.utcnow() - sessionTimeout)) + + expiredSessions = query.count(); + if expiredSessions != 0: + #logging.info("deleting %d sessions" % expiredSessions) + pass + + """ + try: + db.delete(query) + except Exception, exception: + logging.error("some issues raised while deleting the expired sessions") + logging.error("exception type: " + str(type(exception))) + logging.error("exception: " + str(exception)) + """ + pass + +#============================================================================== + +def main(): + application = webapp.WSGIApplication([('/xhr', XHR), ('/dump', XHR), ('/.*', MainPage)], debug=True) + wsgiref.handlers.CGIHandler().run(application) + +if __name__ == "__main__": + main() + diff --git a/doc/install.php.txt b/doc/install.php.txt new file mode 100644 index 0000000..d3a40e8 --- /dev/null +++ b/doc/install.php.txt @@ -0,0 +1,31 @@ +Instructions on how to install and configure your personal instance of the Clipperz application + +Configure the settings on the /php/configuration.php file. +The most important configuration options are the one to connect to the MySQL database: +- $configuration['db'] = 'clipperz'; // database name +- $configuration['host'] = 'localhost'; // database host +- $configuration['user'] = 'root'; // database user +- $configuration['pass'] = 'pass'; // database password +- $configuration['port'] = '3306'; // database port + + +The MySQL database configured above, should already exists, but the setup procedure will take care of creating all the tables used by the application. + +Once the configuration are setup, you should load the /php/setup/index.php page. +Following the instructions, the script will generate all the database objects, and run some tests to double-check that everything works fine. +In the first page you have to press the "POG me up!" button at the bottom of the page; in the next page, if all the checks are successful, a "Proceed" button will be enabled below the main text area. Clicking the "Proceed" button you will access the tab of the POG application that enable you to inspect and edit the content of the database used by the Clipperz application. + +Once the application is successfully installed, it is probably a good idea to remove, disable or protect the whole "/php/setup/" folder, in order to avoid anyone from deleting random records from the database. Your data will not be leaked, but it would be possible to delete them anyway. + +At this point the database should be ready to run. + +The PHP code is quite simple, but there are a few dependency on external library that you may have to include, depending of the version of PHP you are using. + +- PDO: http://ca.php.net/pdo +- JSON: http://aurore.net/projects/php-json/ +- BCMath: http://it.php.net/bc + +The code has been compiled using PHP 5.1.6 +The POG class definitions have been configure for use with PHP 5.1+ + +For added convenience, we have added a page at /php/test.php that reports the detailed PHP configuration available on your computer. \ No newline at end of file diff --git a/frontend/beta/css/clipperz/clipperz.css b/frontend/beta/css/clipperz/clipperz.css new file mode 100644 index 0000000..b0601a2 --- /dev/null +++ b/frontend/beta/css/clipperz/clipperz.css @@ -0,0 +1,3238 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* @override + https://www.example.com/css/clipperz.css + http://www.example.com/css/clipperz.css + https://www.example.com/concurrency/css/clipperz.css + https://www.clipperz.com/beta-connection/css/clipperz.css + https://www.example.com/import/css/clipperz.css +*/ + +body { +/* margin-left: 15px; margin-right: 15px;*/ + background-color: white; + color: black; + font-family: Helvetica, Arial, Geneva, sans-serif; +} + +table { +/* width: 100%; */ +} + +/* @group Header */ + +div#applicationVersionType { + position: fixed; + top: 0; + left: 0; + width: 120px; + height: 120px; + z-index: 99999; +} + +div#applicationVersionType.readOnly { +/* background: url(../images/read-only.png) no-repeat fixed -5px -8px; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat fixed -5px -8px; +} + +div#applicationVersionType.TEST { +/* background: url(../images/test-database.png) no-repeat fixed -5px -8px; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat fixed -5px -8px; +} + +div#applicationVersionType.LIVE { + display: none; + visibility: hidden; +} + +div#applicationVersionType.DEBUG { + display: none; + visibility: hidden; +} + +div#header { + background-color: #336; +/* border-bottom: 8px solid #ff9400;*/ +} + +div#logoFrame { +/* float: left; */ +/* height: 44px; */ + min-height: 44px; + background-color: #333366; +} + +div#logoFrame > a { + font-size: 12pt; +} + +img#logo { + padding-left: 15px; +} + +h5.clipperzPayoff { + color: white; + font-size: 10pt; + font-weight: normal; + padding-left: 20px; + display: inline; + vertical-align: 7px; + white-space: nowrap; +} + +/* @group Misc links + */ +div#miscLinks { + float: right; + top: 0; + right: 15px; +} + +div#miscLinks ul { + padding-top: 5px; + padding-right: 3px; +} + +div#miscLinks ul li { + display: inline; + padding-left: 5px; + padding-right: 5px; +} + +div#miscLinks ul li a { + color: #ff9404; + text-decoration: none; + font-size: 10pt; +} + +div#miscLinks ul li a:hover { + text-decoration: underline; +} + +/* @end */ + +/* @end */ + +/* @group Menu */ + +div#mainTabs { +/* background: #ff9400 url(../images/menubarSprite.gif) repeat-x; */ + background: #ff9400 url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCcAOYAANN7AKNfAP2zTf/KgO7QppVXAKJeALFmAOCkTfKtTZhZAPWvTaVgAJ5cAPCsTd2hTdygTaxjAOinTc13APySAOe8gO6rTfSuTZFVAKdhAOqIAN+jTfuyTZJVAO+LAPmxTeuqTbBlAKGDWbFnAOKkTaFdAOmoTfevTeSkTZdXAK9lAPyzTY9TAO+rTeamTfGMALKNWf60TeSmTZ1bAN+BAJpZAP/apvmyTZRWAKliAKpjAJxaAK1lAOiHAPaPANh9APyTANd9APSOANyBAPqQAPiPANF6ANB5AOOEANV9AOaGANV8AOyKANyAAPWPAP6UAPiQANp/AOGDANp+AOaFAOCDAO2KANJ6AP2TAPqRAOOFAM95APSNAP2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAJwAAAeigANdQBRZUD5cLx5MGj1USFU0Q1E/SwBXWxUTNjECKxw3HycLFwkOLRYgJhIuMigkCBsPBBAwIwchKjwROjkZDAEGJQ0zOzUKKQU4HRgiLBVHRgBJQVNNNFJaSj0aVh4vQk5FRBRYTwMTIhgdOAUpCjU7Mw0lBgEMGTk6ETwqIQcjYLAg8GADAhIoZLiQYAKEhRYOElxYcOLDDQ4rBMSwASEQADsK) repeat-x; + height: 26px; +} + +/* @group Exit links */ + +ul#exitLinks { + padding-left: 5px; + padding-top: 3px; +} + +ul#exitLinks li { + display: inline; + font-size: 10pt; + padding-left: 20px; +} + +ul#exitLinks li a { + color: white; + text-decoration: none; +} + +ul#exitLinks li a:hover { + color: #333366; +} +/* +ul#logoutBlock { + padding-top: 3px; +} + +ul#logoutBlock li { + line-height: 14px; +} + +td.logoutTD { + width: auto; +} +*/ + +/* @end */ + +/* @group Menus */ + +div#menus { + padding-right: 1px; + position: absolute; + right: 20; + top: 44px; +/* background: url(../images/menubarSprite.gif) no-repeat right -26px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCcAOYAANN7AKNfAP2zTf/KgO7QppVXAKJeALFmAOCkTfKtTZhZAPWvTaVgAJ5cAPCsTd2hTdygTaxjAOinTc13APySAOe8gO6rTfSuTZFVAKdhAOqIAN+jTfuyTZJVAO+LAPmxTeuqTbBlAKGDWbFnAOKkTaFdAOmoTfevTeSkTZdXAK9lAPyzTY9TAO+rTeamTfGMALKNWf60TeSmTZ1bAN+BAJpZAP/apvmyTZRWAKliAKpjAJxaAK1lAOiHAPaPANh9APyTANd9APSOANyBAPqQAPiPANF6ANB5AOOEANV9AOaGANV8AOyKANyAAPWPAP6UAPiQANp/AOGDANp+AOaFAOCDAO2KANJ6AP2TAPqRAOOFAM95APSNAP2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAJwAAAeigANdQBRZUD5cLx5MGj1USFU0Q1E/SwBXWxUTNjECKxw3HycLFwkOLRYgJhIuMigkCBsPBBAwIwchKjwROjkZDAEGJQ0zOzUKKQU4HRgiLBVHRgBJQVNNNFJaSj0aVh4vQk5FRBRYTwMTIhgdOAUpCjU7Mw0lBgEMGTk6ETwqIQcjYLAg8GADAhIoZLiQYAKEhRYOElxYcOLDDQ4rBMSwASEQADsK) no-repeat right -26px; +} + + +div#menus table { + padding-left: 1px; +/* background: url(../images/menubarSprite.gif) no-repeat 0 -52px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCcAOYAANN7AKNfAP2zTf/KgO7QppVXAKJeALFmAOCkTfKtTZhZAPWvTaVgAJ5cAPCsTd2hTdygTaxjAOinTc13APySAOe8gO6rTfSuTZFVAKdhAOqIAN+jTfuyTZJVAO+LAPmxTeuqTbBlAKGDWbFnAOKkTaFdAOmoTfevTeSkTZdXAK9lAPyzTY9TAO+rTeamTfGMALKNWf60TeSmTZ1bAN+BAJpZAP/apvmyTZRWAKliAKpjAJxaAK1lAOiHAPaPANh9APyTANd9APSOANyBAPqQAPiPANF6ANB5AOOEANV9AOaGANV8AOyKANyAAPWPAP6UAPiQANp/AOGDANp+AOaFAOCDAO2KANJ6AP2TAPqRAOOFAM95APSNAP2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAJwAAAeigANdQBRZUD5cLx5MGj1USFU0Q1E/SwBXWxUTNjECKxw3HycLFwkOLRYgJhIuMigkCBsPBBAwIwchKjwROjkZDAEGJQ0zOzUKKQU4HRgiLBVHRgBJQVNNNFJaSj0aVh4vQk5FRBRYTwMTIhgdOAUpCjU7Mw0lBgEMGTk6ETwqIQcjYLAg8GADAhIoZLiQYAKEhRYOElxYcOLDDQ4rBMSwASEQADsK) no-repeat 0 -52px; +} + +div#menus table tbody tr td { + cursor: pointer; +} + +div#menus table tbody tr td div { +/* background: url(../images/menubarSprite.gif) no-repeat right -52px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCcAOYAANN7AKNfAP2zTf/KgO7QppVXAKJeALFmAOCkTfKtTZhZAPWvTaVgAJ5cAPCsTd2hTdygTaxjAOinTc13APySAOe8gO6rTfSuTZFVAKdhAOqIAN+jTfuyTZJVAO+LAPmxTeuqTbBlAKGDWbFnAOKkTaFdAOmoTfevTeSkTZdXAK9lAPyzTY9TAO+rTeamTfGMALKNWf60TeSmTZ1bAN+BAJpZAP/apvmyTZRWAKliAKpjAJxaAK1lAOiHAPaPANh9APyTANd9APSOANyBAPqQAPiPANF6ANB5AOOEANV9AOaGANV8AOyKANyAAPWPAP6UAPiQANp/AOGDANp+AOaFAOCDAO2KANJ6AP2TAPqRAOOFAM95APSNAP2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAJwAAAeigANdQBRZUD5cLx5MGj1USFU0Q1E/SwBXWxUTNjECKxw3HycLFwkOLRYgJhIuMigkCBsPBBAwIwchKjwROjkZDAEGJQ0zOzUKKQU4HRgiLBVHRgBJQVNNNFJaSj0aVh4vQk5FRBRYTwMTIhgdOAUpCjU7Mw0lBgEMGTk6ETwqIQcjYLAg8GADAhIoZLiQYAKEhRYOElxYcOLDDQ4rBMSwASEQADsK) no-repeat right -52px; +} + +div#menus table tbody tr td div a { + display: block; + color: white; + font-size: 10pt; + text-decoration: none; + padding: 0px 15px; +/* background: url(../images/menubarSprite.gif) no-repeat left -26px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCcAOYAANN7AKNfAP2zTf/KgO7QppVXAKJeALFmAOCkTfKtTZhZAPWvTaVgAJ5cAPCsTd2hTdygTaxjAOinTc13APySAOe8gO6rTfSuTZFVAKdhAOqIAN+jTfuyTZJVAO+LAPmxTeuqTbBlAKGDWbFnAOKkTaFdAOmoTfevTeSkTZdXAK9lAPyzTY9TAO+rTeamTfGMALKNWf60TeSmTZ1bAN+BAJpZAP/apvmyTZRWAKliAKpjAJxaAK1lAOiHAPaPANh9APyTANd9APSOANyBAPqQAPiPANF6ANB5AOOEANV9AOaGANV8AOyKANyAAPWPAP6UAPiQANp/AOGDANp+AOaFAOCDAO2KANJ6AP2TAPqRAOOFAM95APSNAP2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAJwAAAeigANdQBRZUD5cLx5MGj1USFU0Q1E/SwBXWxUTNjECKxw3HycLFwkOLRYgJhIuMigkCBsPBBAwIwchKjwROjkZDAEGJQ0zOzUKKQU4HRgiLBVHRgBJQVNNNFJaSj0aVh4vQk5FRBRYTwMTIhgdOAUpCjU7Mw0lBgEMGTk6ETwqIQcjYLAg8GADAhIoZLiQYAKEhRYOElxYcOLDDQ4rBMSwASEQADsK) no-repeat left -26px; + height: 26px; + line-height: 26px; +} + +div#menus table tbody tr td.hover div a { + color: #333366; +} + +/* @group .selected */ +div#menus table tbody tr td.selectedTab { +/* background: url(../images/menubarSprite.gif) repeat-x right -78px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCcAOYAANN7AKNfAP2zTf/KgO7QppVXAKJeALFmAOCkTfKtTZhZAPWvTaVgAJ5cAPCsTd2hTdygTaxjAOinTc13APySAOe8gO6rTfSuTZFVAKdhAOqIAN+jTfuyTZJVAO+LAPmxTeuqTbBlAKGDWbFnAOKkTaFdAOmoTfevTeSkTZdXAK9lAPyzTY9TAO+rTeamTfGMALKNWf60TeSmTZ1bAN+BAJpZAP/apvmyTZRWAKliAKpjAJxaAK1lAOiHAPaPANh9APyTANd9APSOANyBAPqQAPiPANF6ANB5AOOEANV9AOaGANV8AOyKANyAAPWPAP6UAPiQANp/AOGDANp+AOaFAOCDAO2KANJ6AP2TAPqRAOOFAM95APSNAP2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAJwAAAeigANdQBRZUD5cLx5MGj1USFU0Q1E/SwBXWxUTNjECKxw3HycLFwkOLRYgJhIuMigkCBsPBBAwIwchKjwROjkZDAEGJQ0zOzUKKQU4HRgiLBVHRgBJQVNNNFJaSj0aVh4vQk5FRBRYTwMTIhgdOAUpCjU7Mw0lBgEMGTk6ETwqIQcjYLAg8GADAhIoZLiQYAKEhRYOElxYcOLDDQ4rBMSwASEQADsK) repeat-x right -78px; +} + +div#menus table tbody tr td.selectedTab div { +/* background: url(../images/menubarSprite.gif) no-repeat right -130px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCcAOYAANN7AKNfAP2zTf/KgO7QppVXAKJeALFmAOCkTfKtTZhZAPWvTaVgAJ5cAPCsTd2hTdygTaxjAOinTc13APySAOe8gO6rTfSuTZFVAKdhAOqIAN+jTfuyTZJVAO+LAPmxTeuqTbBlAKGDWbFnAOKkTaFdAOmoTfevTeSkTZdXAK9lAPyzTY9TAO+rTeamTfGMALKNWf60TeSmTZ1bAN+BAJpZAP/apvmyTZRWAKliAKpjAJxaAK1lAOiHAPaPANh9APyTANd9APSOANyBAPqQAPiPANF6ANB5AOOEANV9AOaGANV8AOyKANyAAPWPAP6UAPiQANp/AOGDANp+AOaFAOCDAO2KANJ6AP2TAPqRAOOFAM95APSNAP2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAJwAAAeigANdQBRZUD5cLx5MGj1USFU0Q1E/SwBXWxUTNjECKxw3HycLFwkOLRYgJhIuMigkCBsPBBAwIwchKjwROjkZDAEGJQ0zOzUKKQU4HRgiLBVHRgBJQVNNNFJaSj0aVh4vQk5FRBRYTwMTIhgdOAUpCjU7Mw0lBgEMGTk6ETwqIQcjYLAg8GADAhIoZLiQYAKEhRYOElxYcOLDDQ4rBMSwASEQADsK) no-repeat right -130px; +} + +div#menus table tbody tr td.selectedTab div a { + color: #333366; +/* background: url(../images/menubarSprite.gif) no-repeat left -104px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCcAOYAANN7AKNfAP2zTf/KgO7QppVXAKJeALFmAOCkTfKtTZhZAPWvTaVgAJ5cAPCsTd2hTdygTaxjAOinTc13APySAOe8gO6rTfSuTZFVAKdhAOqIAN+jTfuyTZJVAO+LAPmxTeuqTbBlAKGDWbFnAOKkTaFdAOmoTfevTeSkTZdXAK9lAPyzTY9TAO+rTeamTfGMALKNWf60TeSmTZ1bAN+BAJpZAP/apvmyTZRWAKliAKpjAJxaAK1lAOiHAPaPANh9APyTANd9APSOANyBAPqQAPiPANF6ANB5AOOEANV9AOaGANV8AOyKANyAAPWPAP6UAPiQANp/AOGDANp+AOaFAOCDAO2KANJ6AP2TAPqRAOOFAM95APSNAP2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAJwAAAeigANdQBRZUD5cLx5MGj1USFU0Q1E/SwBXWxUTNjECKxw3HycLFwkOLRYgJhIuMigkCBsPBBAwIwchKjwROjkZDAEGJQ0zOzUKKQU4HRgiLBVHRgBJQVNNNFJaSj0aVh4vQk5FRBRYTwMTIhgdOAUpCjU7Mw0lBgEMGTk6ETwqIQcjYLAg8GADAhIoZLiQYAKEhRYOElxYcOLDDQ4rBMSwASEQADsK) no-repeat left -104px; +} + +/* @end */ +/* +ul#menus li { + display: inline; + padding: 4px 15px; + margin-right: 2px; + color: white; + cursor: pointer; + line-height: 16px; + border: 1px solid white; + border-bottom: 0px; + position: relative; + top: -5px; +} + +ul#menus li:hover { + border: 1px solid #ff9400; + border-bottom: 0px; +} + +ul#menus li.selectedTab { + border: 1px solid #ff9400; + background-color: #ff9400; + border-bottom: 0px; + color: #333366; +} + +ul#menus li.selectedTab:hover { + border: 1px solid #ff9400; + background-color: #ff9400; + border-bottom: 0px; + padding: 4px 15px; + color: #333366; +} +*/ + +/* @end */ + +/* @end */ + +/* @group Content */ + +div#content { + margin-top: 15px; +} + +div#main { + padding-top: 15px; +/* margin-left: 15px; margin-right: 15px;*/ +} + +div#main ul li.selectedPanel { + padding: 0px 15px; +} + +div#main ul li#recordsPanel { + padding: 0px; +} + +div#main ul li ul li.selectedPanel { + padding: 0px; +} + +/* @group Login page */ + + +/* @group Service description */ +div.clipperzServiceDescription { + color: #666666; + padding-left: 10px; + margin-right: 20px; +} + +div.clipperzServiceDescription h2 { + color: #ff9400; + font-size: 20pt; + margin-bottom: 15px; +} + +div.clipperzServiceDescription ul li h3 { +} + +div.clipperzServiceDescription ul li ul { + list-style-position: outside; + list-style-type: disc; + color: #ff9400; + margin-bottom: 15px; + margin-left: 20px; +} + +div.clipperzServiceDescription ul li ul li p { + display: inline; + color: #999999; + font-size: 11pt; +} + +div.clipperzServiceDescription ul li a { + color: #333366; + font-weight: bold; +} + +/* @end */ + +/* @group Form */ + +div.clipperzLoginForm { +/* border: 4px solid #ff9400; */ + color: #999999; + font-size: 11pt; + width: 400px; + height: 350px; +} + +div.clipperzLoginForm a { + margin-left: 10px; + color: #333366; + text-decoration: none; + font-weight: bold; +} + +div.clipperzLoginForm a:hover { + text-decoration: underline; +} + +div.clipperzLoginForm div.loginFormHeaderBox { + padding: 30px 20px 0px 20px; +/* background: url(../images/loginFormBox.png) no-repeat -3px top; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat -3px top; +} + +div.clipperzLoginForm h3 { + color: #666666; + font-size: 14pt; + padding: 0px 15px 8px 15px; + border-bottom: 1px dotted #ff9400; +} + +div.clipperzLoginForm form table.formLayout { + color: #999999; + font-size: 10pt; + padding: 0px 25px; +} + +div.clipperzLoginForm form table tbody tr.formFieldTR td { + height: 22px; +} + +input.loginFormField { + font-size: 10pt; + height: 20px; + width: 251px; +/* width: 330px; */ +} + +div.passwordTypeChooser { + padding-top: 2px; + width: 250px; + padding-bottom: 8px; +} + +/* @group Login form */ + +input.passwordTypeCheckbox { + margin-top: 2px; + margin-right: 5px; +} + +div.oneTimePassword input { + width: 59px; + height: 20px; + font-size: 8pt; +} + +div.oneTimePassword span { + font-size: 7px; + padding: 0px 1px; + color: #666666; +} + +div.clipperzLoginForm div.loginForm { + text-align: left; +/* background: url(../images/loginFormBox.png) repeat-y -408px; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAABMAAAAAvCAIAAACKdSGFAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAv4SURBVHja7N3Zj1vlGcfxY3u8e7ZMokCUNCIbVdIAQrlAkZAIoSigFoTaSOWmN73oQiWqUlX9D0oXEL0A2steRSqV2kRViygpaaAsEpCKQNIkbRayTZaZTGbz2B7bfY6f8eM3niU+E0/EnPl+VE09M6aDjtWf3t857xKpVqseACxC27Z998MPfzfHGyqVyuTkZKFQGB8fHx0dHRkZuXbt2uDg4Df6v9V40zMlriSAYF6O28s/rtyzfPny7ppsNpvJZJLJZDwej0QitxhfpVJJ42tsbGx4eHhoaGhgYOCbl54mvgC0K76WLVvW29vb1dWVy+XS6bTGVzQanft/I8plBBBi7j0yfc1dMwDtJWVvxrQBgFCiQAIIf4dkMAdgUQfO3M8zAeBWsiVowlAgAQAAvqBju5vOJQOAdgVOi02SVAIAAPgiDuZu+hMAuP05Q4EEAAAAALSEAgkAAAAAoEACAACESMlLNL4pjnBBAATghMYNYUKBBAAACA3bJlGMVbsbvxi/yMUBEIATGhImukfXPHbqokACAAB8oXuj7Y44HulpvGPkLFcJQABOaGiYNOUMBRIAAGBxt0d3bBeNRkeiKxpvOvsmFwpAAE5oSJhIpDTdomqxQ3Ys0L/ejKfocpY3sKSGPrN9CwAIGqpaIM/Ftt5deXfqp6f2edt/zsUB0KqTe+2lhImmyjwGaW0ukG5FrFQq+pOm3qg/BxDK0mgxZC8kmyQEAt3ZAgBoZkZvdDG+dbIY64iU/V8PHffOveWt3sGFAnBzEhfXT+jLyWqsP3FP143x0vogrT0Fsqk3akW0r1XHbP8UgBC0R2+mRTu2RHsecyQAYCnnqqWoiMVifpzGs6crd2+IHZl607s/83a/75GoAG7W1vy4qDtd+XIllu7o6NBgaRqkLXiBtBIoL7QrVm7k/rzp/RRIIEyjHPvWGqNFUtP9LWuV1EgAmDtdrT3KUC8ej8vXj6KPra9+NpWfVz72Pn3V2/oDrhWAuRx+xY+Legv7KLpL80TjRWvkbXoCqQ1Qq6D0w3K5rKVxcnLS/6/CSOz8/sTF/bHRM7GJS7HCpWg5z8cHhF4lli4nV5ZTK8u5tcU7d06uejiW6tJsspCS0KBDAsAc3HtwmpzaIQcS646M37sl/snU+97+sde72Vv9EFcMwMzOHfDeec6+OzJ573B2/bJagdQOafeqWnwIOf8Cqe1RG6NVx1KpJO0xcvXf2SMvJS+9Fa2W+MiAJTfoKeej46fj46e9wQ+yn/+hEokXVu4Y2/yj6vL7ZOgTq9MOaU8jAQBGslEHWhqYWh1VIpF4b/Tx9ZX/pKLF2oCs7L2+29v1Gh0SwMztUSKiWtbvJiqJ9yqPa5LE6x1SBJrCOs9xmz111PYopbFYLObz+dLAfzP/+l7f/sfS/W/QHgH4KVMtSSBILEg4FK+eKBQKEhelUsluPLGxFgDM2CHdJ5CJmmQymUqliqk7/zy+u1KpLwUqDHn7dvlT1FgcBMApbH4sSDhIRNRIaEh0SIBIjEiYWIfUkFnYAmk74mh1lIGgDAcnJia8M6/3vfnV7Pl9zEkDMH0kJOEgEVE59VfrkBIgdiuKSwQAM3ZIfT6gHVKHffL1Qvyev4/tdAZnZe/gs95rD/gbLQKARIEEgsRC/dmjkNCQ6LD2qGwrnQVcA9nUHrVAynAwdfSV3qO/aP673Ru9dU96ax7xOtd4mVVeIsenCYRfcdQbv+CNnPXPqz251/aMFrHy2IoPvjN4/aeFLT/U7bW82gQt/S1zWQFgeoHUKaz2BDKTyehtuEPFHeWh8q6uAzLwm/oHrnzs7X3U69nk3fUEoy+A0ZeRMdfrww8d7ni4O+NLp9NSI7U9LniBnN4e9dmjtMdlx3/luX90xf3e9uc5mwhYimSwktjkj2DW7PQPuT73lr9zdH3vL0mnvmO/vFqtFjY/M30rZjokAFh7tJ0tdA2kjPZk2CdDLymQpZpDwzv6ry57uu8v6ZizbmjouHfo1/5/AMDz8uX4noGv9Sfv68xksjXSIfU5pG5OYbPlF/AYj6Z1j9Gzb/Qdc9pjJOY9+KL3le9zKhEA3+od/jFln77qbxVYn0choXE+s66wdpc7TuJoHwCY3iFtEx0pkDL60g6p9/FlSHZh5J7f9PftzB3Y1nWCNUQAXDKy+nB44z/GdpTSqzqz2Vwul6k/gXTXQE4dM9uyjkD/BnZch7bHQqEwOfi/L33yXCOvkj3sAwZg+iDIP6asd7O/D1htJbf84M7DP/k8tyGyfKN7x4tNWQGgqUPaQ0gZ8OlhaVPnpdUXAoxGVv9p9Kl/Xj/zSPf7WzrPxaOsKgeWulIl+tnImv3DDwzG1kpj7OrslPbYWZPNZt0prEHnrwYokHZoh22cI/L5fN+xF2LlsXrIxWiPAGYl4SARsW+XPoeU6Og59sJg7qWIQyJMcoYOCQDWHmUMJiO8eDxuu98LW1Vk6yRH8hv2XF9duTyyMXlqc/bM8vhwT3y8JzGeipW5kkDoTZRjQ8XMUClztdR1ZGzticJdkUROimJnOp2tPXu09ug+gXQL5IKsgbQnkFog/W1Xrxzqufy3xlTVB1+kPQK4SYeUoDj4rH4nATJw+duFO7bZMdn6gusEAEbvqckYTDtkKpWyZ486wVXrpQwH8/n8xETyZLHr+PAWGa3ZaUn6ZlsmwHoBIATcymeLGPVMDgmETHdSd2zO1Nc9SofUr9oehe6gE7Q9BiuQmkG2d06hUFh58tXGH1txv7/uEQDmJkFx9Pe6p44ESN/J317qfdkiTOk9dS4VAGgY2tDQPfTIHTLqBq1iYmJCz1drKpCclgSEOCJsBKW3k3TGuxVI7ZD2IlWj2+fMY/5qqwXSpknY40e/QI4Odl9/v/Gm7c+zaw6AVqLOj4u9j+p33dffOzt2raNOgkxyJuidMAAI9wDRJvZLUbSxmZ3woY8fZUSYTqelQNpBu7ZUUtsjHRIIa3t0N9yyTNBYsA6pEaFLH3XyqrxNa+eCFEjNKXcBpGRT+srb0Wp9z+ieTZzYAaBVEhfdG/WEIomR1OWDxfTXdSswuxnGRQIAl87OcDuk+8BBR4rSHvWEj9meQDJ5FQhfMnizPIHUiQk2YdUePNrxj/OYvDqfAqlhJMHkz18dfKfx67ue4PMDEMC6J+2Mss7Bd/rveFSiTRJGcs3dGYLrBABe7TmDbqWj38r4zwaLOl6Un/g392snfOhOh/r4UTukhioFEghlONgRjjqhXedzJer0sEf96p7bIea99f18prAWa5IT5xvvWPMInx+AACQ06gVSwsQmXOnuguyjAwCzdUhbFWn7r0p+6gMHq44WpzZ/dcYCSZ8EFmMUTH9hgWAdUouiLpCO11i3tGeP857wdfMCaYljU1jlq4z2EqWrjTd1ruHjBBCAExoSJm57tJvlPIEEgOkd0masWYHUwaIEqY7TbPKqe9qHxxpIIKRlsqlAWizYdFZbG+lud38ry4VafQJpi7B1CqtIVQYb78is4iMEEIATGhImurja3e+B++IAMNt4UY/MleGgbpshYzMdHepMsYqjafUj0QqELA1U00pIOx1NS6NlhU12vcV79AGO8dCHA3pny58sUS00fpfI8SkCCMAJDQkTm3Ml7GY5AGC2gaP79ED7pO5inUgk3GeP1h7JVSDcNdKaoc1NsHkK7oTVtuxT2FKBdG9i2URWPjAA7WITrjRn2EcHAFoZNepY0IaGNmBzZ65Ob4+USSBM1bFpMaQbC5EbtetPB9iF1S2QTKMH0Ea20wPzVwEg6AhS10Z6Nz6ZnHHnVdIVCF+BNPZ//6a1kW3/08EKpFsj+dgAtL1A2uCGUQ4AzKNJzpGf5CqwRJrkQk/gCrALq1VHm1IPAG3hTrtyjywDANz6aPL2jCkBLBEtLaN0p0C4a7IBoF2aVuxwQQAAABZrgZw+wmN4B6CN3F0fuBoAAADhKZBcMgALipwBAAAISYFkeAdg4Uoj2QIAABDCAgkAAAAAoEACAAAAAHDLBZLZZQAAAABAgQxQHVmqBGAh6OFA09MGAAAAi6xAevUDPLheAG4DAgcAAGBxF0gAAAAAwBL3fwEGAGLpZ+CuDirCAAAAAElFTkSuQmCCCg==) repeat-y -408px; + margin: 0px; +} + +div.clipperzLoginForm form table.formLayout { + margin: 7px 10px 4px; +} + +div.loginForm div.loginFormFooterBox { + padding: 0px 20px 30px 20px; +/* background: url(../images/loginFormBox.png) no-repeat -813px bottom; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat -813px bottom; +} + +div.loginForm ul { + padding: 8px 15px 8px 15px; + border-top: 1px dotted #ff9400; +} + +div.loginFormButtonFooter { + padding: 0px 40px 10px; +} + +/* @end */ + +/* @group Registration form */ + +div.clipperzLoginForm div.registrationForm { + text-align: left; +/* background: url(../images/loginFormBox.png) repeat-y -408px; */ + background: url(data:image/png;charset=utf-8;base64,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) repeat-y -408px; + margin: 0px; +} + +div.clipperzLoginForm div.registrationForm form a { + margin: 0px; +} +div.registrationForm form table.formLayout { + padding: 10px; +/* padding: 4px 10px;*/ + margin: 0px 20px; +} + + +/* +div.clipperzLoginForm form.read-only table.formLayout { + background-image: url(../images/read-only_background.png); +} + +div.panelBody form.read-only table.panelBody { + background-image: url(../images/read-only_background.png); +} + +*/ + +div.clipperzLoginForm form.read-only table.formLayout, div.panelBody form.read-only table.panelBody, div.clipperzSubPanel span.read-only, div.read-only { +/* background-image: url(../images/read-only_background.png); */ + background-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAT8SURBVHjaxJppc9NIEIZbshTHxkACNhRHQVGQAwJF8cv5FxRfdosjCVeyG7aA3U3sOM7tIxLdGmFLmkMz40lwpSo+ZtR69HbPdLfkxZsvD6AyW4XkFSd/cP0ZwOW7wL32vwLsfgDwMt9FOKHeBGg+B6jM5McPjwG2/8T/Bzjn1yQyUAG48QKg1uJtdD8D9P7ibTRuow08L8/Pjx/0AP593Q8gqM9CpRowCJw9vwBw6TZv4PA7gvwNENYKEPMI/gTAD/PjRycAnXUcM8I59ZSBIHw2vtbkbfTw+Ic/eBuNGwDXlgUQeIE6H+mdF0AcxWMl5hcR4pYYYu8Lf5VmFRDtNVTiEH/z9CFIcd8rXCgJBKncQRtnp8nBM0ooILpfknMYk1hBoDtdf2wB8TjjllklUoj0t4ApsaBWQgixgt8HehBehZ2QlRIFCDp2AYLE8OKDbwNo3AnV7jQFRKLEsjiwxxAFGwZKJDaiaOjFcTzAj3mQw28IseEIokwJEYQoJvDY7VUewp+h8cNArIQFxEjkTssWECIlyJ0kEBSn1TnweSUs3ckTQbQslDCHYMHu2p1wRbdTQrRPEMR7hOgrIQDSQzKITUfutOQuJjQhmCJk4OCrAGJOAYFSD48slNDd7Ciw9SFo+fWh+0mixFMDCF0lzgGCfsNUKDBzJ5kSSyWBPa0SoRyCFqf9fzLBroQ4ZRAjmRKti1cCUghKMvGcAj2I9xJ3WnajhHJ1wnOqXhUrkUJARNfLNcT+lgTiJlNPuDqt6kMUlJisWhSgSRYrgRjZKCFypyUHSkRsrytA0BwvPhsOECLUV0KSO5ESvS2JEotsrlbuFLIVU6REl1civVCYaxkrYbLE3jRUQgIRi90psUEl+dxDCJwoIQ3sRYOYUCghcqcMBG0fQbkSvkZRZKKEI3fKQEySxotQ4hwhGMjoOM1ibZTwfrsSE5D//8B5ZwYQpkpIylMpBCgg7iDEI378aQe9myuKCOKJZJ/YYi4l3bErU0LErEEnhVgQQHQBtt9Q0iiCaBpAyNzJtRISiM4HHDNIg70UQpU7ySDWHcaEwJ36XWYjHiY2WIMOypQwSQAlSnguYyIPkS6/FXdtTGMlwC4mChAs1zraHkC9FTrpxbZlMbEiqCfcQeAHSYPOQS9WnYpbQFBMtAUQlRp5lKBB56IXm6vsDCAaisAWQtQBmmgjbBSSRmU9cRFKiCD25EqkEPkGnbTv1Dp/JaRL7B6rWeLRxAaND+o5iAmIaS9WGtiyRoEtxFoegmwENQ6CgYwNaPZik8rOBMJysxNBJO6Ey3h4iSuBfehtpgY0e7Ht1XOG2DODiDDh3XmbybW0erEGEBrlqVZMKJVACOqUHv1XaNC57gBOG9hlELsfAY53Ehv+dB3AFUdKdC0gPo0hWLCr7mNfmBImMTFi7pSBYCD0RIGzXuyGhRLrAohZdUwUIFjSGJ0NECLkVyeEiEx6sRvs/qNmjT1tTIwvXgRkA3Mt2eoU9SVZrF4vVglxihC7a24grj4AuHK/kGu56sUqISSpuMqdSiAm9xBLO4Ar1h1AVXmah3hmDTHJtUz7TrGNO5lCROzJn5NyCAYy2PeMGwWmEKTEroUSJ4XVSQLBHnP68QoJ4moyIU5P1JthD5JxSqQb0a/CK8pAXLknhjjpYC70JmnZ5Gz4ipjYeZekHTkbNI+Oz0Pg2O/9nwIMAFYA4szm5y3UAAAAAElFTkSuQmCCCg==); +} + +div.registrationForm div.loginFormFooterBox { + padding: 0px 20px 30px 20px; +/* background: url(../images/loginFormBox.png) no-repeat -813px bottom; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat -813px bottom; +} + +div.registrationForm ul { + padding: 8px 15px 8px 15px; + border-top: 1px dotted #ff9400; +} + +/* @end */ + + +/* @end */ + +/* @group Registration splash */ + +div#splashMessage table { + width: auto; + color: #333366; + font-size: 10pt; + padding: 10px; +} + +div#splashMessage span { + color: #666666; +} + +div#splashMessage table span.label { + color: #999999; + padding-right: 10px; +} + +div#splashMessage table span.value { + color: #666666; + font-weight: bold; +} + +div#splashMessage input { + margin-right: 5px; +} +/* @end */ + +/* @group Browser compatibility box */ + +div.browserCompatibilityBox { + color: #666666; + padding: 0px 0px; +/* border: 4px solid #ff9400; */ + font-weight: bold; + text-align: center; + width: 400px; +} + +div.browserCompatibilityBox p { + margin: 0px 50px; +} +div.browserCompatibilityBox a { + color: #666666; +} + +/* @end */ + +/* @group Language switch */ + +li#loginPanel { + padding: 0px 15px; +} + +div.loginPanelSwitchLanguageBox { + color: #666666; + padding: 12px 0px 10px 0px; +/* border: 4px solid #ff9400; */ + font-weight: bold; + text-align: center; + height: 75px; +/* background: url(../images/languageBox.png) no-repeat 19px -15px; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat 19px -15px; + width: 400px; + margin: 0px; +} + +option.disabledOption { + color: #999999; +} + +/* @end */ + +/* @end */ + +/* @group Record page */ +div.mainPanelMinHeightDiv { + width: 15px; + min-width: 15px; + height: 200px; +} + +table#mainPanelTABLE { + width: 100%; +} + +/* @group Direct logins */ + +div#directLoginsBlock { + width: 230px; + padding: 0px; +/* border: 4px solid #ff9400;*/ +/* background: url(../images/directLoginBox.png) repeat-y -262px bottom; */ + background: url(data:image/png;charset=utf-8;base64,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) repeat-y -262px bottom; +} + +div#directLoginsBlock div.directLoginsBlockHeaderBox { +/* background: url(../images/directLoginBox.png) no-repeat -11px -13px; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat -11px -13px; +} + +div#directLoginsBlock h3 { + text-align: center; + color: #666666; + padding-top: 12px; + padding-bottom: 5px; + margin: 0px 10px 0px 10px; + border-bottom: 1px dotted #ff9400; + font-size: 12pt; +} + +ul#directLogins { +/* padding: 7px 20px 45px 20px; */ + padding: 7px 12px 45px 12px; + min-height: 200px; +/* background: url(../images/directLoginBox.png) no-repeat -513px bottom; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat -513px bottom; +} + +ul#directLogins li { + border-top: 1px solid white; + border-bottom: 1px solid white; + padding: 1px 0px; + width: 206px; +} + +ul#directLogins li.hover { + border-top: 1px solid #ffc880; + border-bottom: 1px solid #ffc880; + background-color: #fff9f2; + cursor: pointer; +} + +ul#directLogins li img { + width: 16px; + height: 16px; +} + +ul#directLogins li div { +} + +/* @group Direct logins description */ + +div#directLoginsDescription { + padding: 6px 20px 50px 20px; + color: #999999; + font-size: 10pt; +/* background: url(../images/directLoginBox.png) no-repeat -513px bottom; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat -513px bottom; +} + +div#directLoginsDescription p { + padding-bottom: 8px; +} + +div#directLoginsDescription a { + color: #333366; +} + +div#directLoginsDescription ul { + padding-left: 20px; + list-style-position: outside; + list-style-type: circle; + color: #ff9400; + padding-bottom: 10px; +} + +div#directLoginsDescription ul li { + padding-bottom: 3px; +} + +div#directLoginsDescription ul li p { + display: inline; + color: #999999; +} + +/* @end */ + +/* @group Direct login [open] */ + +ul#directLogins li a.directLoginItemTitle { + color: #336; + font-size: 10pt; + line-height: 16px; +} + +ul#directLogins li table { + width: 100%; +} + +ul#directLogins li a.directLoginItemTitle:hover { + text-decoration: underline; +} + +/* @end */ + +/* @group Direct login [edit] */ + +ul#directLogins li a.directLoginItemEditButton { + visibility: visible; + color: white; + font-size: 8pt; +/* background-color: #ff9400;*/ + padding: 0px 5px; + line-height: 14px; +} + +ul#directLogins li.hover a.directLoginItemEditButton { + visibility: visible; + color: #ff9400; +/* border-top: 3px solid #fff9f2;*/ +} + +ul#directLogins li.hover a.directLoginItemEditButton:hover { + color: #35306b; +} + +/* @end */ + +/* @end */ + +/* @group Records */ + +div#recordListBlock { + width: 250px; + min-height: 200px; +} + +div#recordListFilterHeader { +/* background: url(../images/cardFiltersSprite.gif) repeat-x 0 -114px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCFAOYAAISEuaen6ZSU0KCg4IKCt8zM9bOz0qWl552d3JGRzJqb2Gpqlaio7MfH7oeHvcTF6snJ8ZeX1IKCtr+/48HB5cLC6La216Oj5IyLxLy83nd3p3JyoGdnkrm53Li42YCAtMvL9LKy0W5umnl5qo6OyHR1o3BwnY+PqcrK8nt7rrW11X5+sYaFuuDg+WZmj7294Gtrl9HR5MbG7LS01KOjxH5+somJwYaHvH9/so+OyIaGvJKSzamp7IuMxImJwJua2JeX1aKj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAIUAAAd8gAUMAQcXAwgKEQIJJBg2NwAEBjUtICgQDTIPFRQTLxkdHhYqMzEhNA4sABIfKykjGiUbJiIwCxwnLgUEADo+PTk7AkA/CANBBwE8BjgtHAswIiYbJRojKSsfEgAsDqY0MyoWHh0ZLxMUFQ8yDRAoILmChIaIioyOkJI1gQA7Cg==) repeat-x 0 -114px; +} + +/* @group Record filters */ + + +div#recordFiltersTableWrapper { +/* padding: 0px; border: 0px; margin: 0px; */ + margin-left: 15px; + padding-left: 1px; +/* background: url(../images/cardFiltersSprite.gif) no-repeat left -38px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCFAOYAAISEuaen6ZSU0KCg4IKCt8zM9bOz0qWl552d3JGRzJqb2Gpqlaio7MfH7oeHvcTF6snJ8ZeX1IKCtr+/48HB5cLC6La216Oj5IyLxLy83nd3p3JyoGdnkrm53Li42YCAtMvL9LKy0W5umnl5qo6OyHR1o3BwnY+PqcrK8nt7rrW11X5+sYaFuuDg+WZmj7294Gtrl9HR5MbG7LS01KOjxH5+somJwYaHvH9/so+OyIaGvJKSzamp7IuMxImJwJua2JeX1aKj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAIUAAAd8gAUMAQcXAwgKEQIJJBg2NwAEBjUtICgQDTIPFRQTLxkdHhYqMzEhNA4sABIfKykjGiUbJiIwCxwnLgUEADo+PTk7AkA/CANBBwE8BjgtHAswIiYbJRojKSsfEgAsDqY0MyoWHh0ZLxMUFQ8yDRAoILmChIaIioyOkJI1gQA7Cg==) no-repeat left -38px; + height: 19px; +} + +div#recordFiltersDIV table { + padding-right: 1px; +/* background: url(../images/cardFiltersSprite.gif) no-repeat right -19px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCFAOYAAISEuaen6ZSU0KCg4IKCt8zM9bOz0qWl552d3JGRzJqb2Gpqlaio7MfH7oeHvcTF6snJ8ZeX1IKCtr+/48HB5cLC6La216Oj5IyLxLy83nd3p3JyoGdnkrm53Li42YCAtMvL9LKy0W5umnl5qo6OyHR1o3BwnY+PqcrK8nt7rrW11X5+sYaFuuDg+WZmj7294Gtrl9HR5MbG7LS01KOjxH5+somJwYaHvH9/so+OyIaGvJKSzamp7IuMxImJwJua2JeX1aKj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAIUAAAd8gAUMAQcXAwgKEQIJJBg2NwAEBjUtICgQDTIPFRQTLxkdHhYqMzEhNA4sABIfKykjGiUbJiIwCxwnLgUEADo+PTk7AkA/CANBBwE8BjgtHAswIiYbJRojKSsfEgAsDqY0MyoWHh0ZLxMUFQ8yDRAoILmChIaIioyOkJI1gQA7Cg==) no-repeat right -19px; +} + +div#recordFiltersDIV table tbody tr td { + cursor: pointer; + height: 19px; +} + +div#recordFiltersDIV table tbody tr td div { +/* background: url(../images/cardFiltersSprite.gif) no-repeat right -38px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCFAOYAAISEuaen6ZSU0KCg4IKCt8zM9bOz0qWl552d3JGRzJqb2Gpqlaio7MfH7oeHvcTF6snJ8ZeX1IKCtr+/48HB5cLC6La216Oj5IyLxLy83nd3p3JyoGdnkrm53Li42YCAtMvL9LKy0W5umnl5qo6OyHR1o3BwnY+PqcrK8nt7rrW11X5+sYaFuuDg+WZmj7294Gtrl9HR5MbG7LS01KOjxH5+somJwYaHvH9/so+OyIaGvJKSzamp7IuMxImJwJua2JeX1aKj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAIUAAAd8gAUMAQcXAwgKEQIJJBg2NwAEBjUtICgQDTIPFRQTLxkdHhYqMzEhNA4sABIfKykjGiUbJiIwCxwnLgUEADo+PTk7AkA/CANBBwE8BjgtHAswIiYbJRojKSsfEgAsDqY0MyoWHh0ZLxMUFQ8yDRAoILmChIaIioyOkJI1gQA7Cg==) no-repeat right -38px; +} + +div#recordFiltersDIV table tbody tr td div a { + display: block; + padding: 0px 10px; + font-size: 8pt; + color: white; + line-height: 19px; + height: 19px; +/* background: url(../images/cardFiltersSprite.gif) no-repeat left -19px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCFAOYAAISEuaen6ZSU0KCg4IKCt8zM9bOz0qWl552d3JGRzJqb2Gpqlaio7MfH7oeHvcTF6snJ8ZeX1IKCtr+/48HB5cLC6La216Oj5IyLxLy83nd3p3JyoGdnkrm53Li42YCAtMvL9LKy0W5umnl5qo6OyHR1o3BwnY+PqcrK8nt7rrW11X5+sYaFuuDg+WZmj7294Gtrl9HR5MbG7LS01KOjxH5+somJwYaHvH9/so+OyIaGvJKSzamp7IuMxImJwJua2JeX1aKj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAIUAAAd8gAUMAQcXAwgKEQIJJBg2NwAEBjUtICgQDTIPFRQTLxkdHhYqMzEhNA4sABIfKykjGiUbJiIwCxwnLgUEADo+PTk7AkA/CANBBwE8BjgtHAswIiYbJRojKSsfEgAsDqY0MyoWHh0ZLxMUFQ8yDRAoILmChIaIioyOkJI1gQA7Cg==) no-repeat left -19px; +} + +div#recordFiltersDIV table tbody tr td:hover div a { + color: #ff9400; +} +/* @group selected */ + +div#recordFiltersDIV table tbody tr td.selectedTab { + height: 19px; +/* background: url(../images/cardFiltersSprite.gif) repeat-x -57px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCFAOYAAISEuaen6ZSU0KCg4IKCt8zM9bOz0qWl552d3JGRzJqb2Gpqlaio7MfH7oeHvcTF6snJ8ZeX1IKCtr+/48HB5cLC6La216Oj5IyLxLy83nd3p3JyoGdnkrm53Li42YCAtMvL9LKy0W5umnl5qo6OyHR1o3BwnY+PqcrK8nt7rrW11X5+sYaFuuDg+WZmj7294Gtrl9HR5MbG7LS01KOjxH5+somJwYaHvH9/so+OyIaGvJKSzamp7IuMxImJwJua2JeX1aKj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAIUAAAd8gAUMAQcXAwgKEQIJJBg2NwAEBjUtICgQDTIPFRQTLxkdHhYqMzEhNA4sABIfKykjGiUbJiIwCxwnLgUEADo+PTk7AkA/CANBBwE8BjgtHAswIiYbJRojKSsfEgAsDqY0MyoWHh0ZLxMUFQ8yDRAoILmChIaIioyOkJI1gQA7Cg==) repeat-x -57px; +} + +div#recordFiltersDIV table tbody tr td.selectedTab div { +/* background: url(../images/cardFiltersSprite.gif) no-repeat right -95px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCFAOYAAISEuaen6ZSU0KCg4IKCt8zM9bOz0qWl552d3JGRzJqb2Gpqlaio7MfH7oeHvcTF6snJ8ZeX1IKCtr+/48HB5cLC6La216Oj5IyLxLy83nd3p3JyoGdnkrm53Li42YCAtMvL9LKy0W5umnl5qo6OyHR1o3BwnY+PqcrK8nt7rrW11X5+sYaFuuDg+WZmj7294Gtrl9HR5MbG7LS01KOjxH5+somJwYaHvH9/so+OyIaGvJKSzamp7IuMxImJwJua2JeX1aKj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAIUAAAd8gAUMAQcXAwgKEQIJJBg2NwAEBjUtICgQDTIPFRQTLxkdHhYqMzEhNA4sABIfKykjGiUbJiIwCxwnLgUEADo+PTk7AkA/CANBBwE8BjgtHAswIiYbJRojKSsfEgAsDqY0MyoWHh0ZLxMUFQ8yDRAoILmChIaIioyOkJI1gQA7Cg==) no-repeat right -95px; +} + +div#recordFiltersDIV table tbody tr td.selectedTab div a { +/* background: url(../images/cardFiltersSprite.gif) no-repeat left -76px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCFAOYAAISEuaen6ZSU0KCg4IKCt8zM9bOz0qWl552d3JGRzJqb2Gpqlaio7MfH7oeHvcTF6snJ8ZeX1IKCtr+/48HB5cLC6La216Oj5IyLxLy83nd3p3JyoGdnkrm53Li42YCAtMvL9LKy0W5umnl5qo6OyHR1o3BwnY+PqcrK8nt7rrW11X5+sYaFuuDg+WZmj7294Gtrl9HR5MbG7LS01KOjxH5+somJwYaHvH9/so+OyIaGvJKSzamp7IuMxImJwJua2JeX1aKj5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAABAIUAAAd8gAUMAQcXAwgKEQIJJBg2NwAEBjUtICgQDTIPFRQTLxkdHhYqMzEhNA4sABIfKykjGiUbJiIwCxwnLgUEADo+PTk7AkA/CANBBwE8BjgtHAswIiYbJRojKSsfEgAsDqY0MyoWHh0ZLxMUFQ8yDRAoILmChIaIioyOkJI1gQA7Cg==) no-repeat left -76px; +} + +div#recordFiltersDIV table tbody tr td.selectedTab:hover div a { + color: white; +} + + + +/* @end */ + +/* @group record filter - SEARCH */ + +div#recordFiltersSearchPanel { + position: absolute; +} + +div#recordFiltersSearchInnerPanel { + padding: 10px 24px 25px 24px; +/* background: url(../images/recordFilterBackground.png) no-repeat -10px -138px; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAQ4AAADMCAYAAACC5k2uAAANIWlDQ1BJQ0MgUHJvZmlsZQAAeJyV13k0lG8bB/BrFsYyZhhjDyO77LKHLJFItmwp2bdhJiZRypIUIkso2iiSFC0kEtWPLCHJkq2oyJI9kmXeP6R6f+f9ve95rz+ecz3385xz389zzud7nxsAr+FKpZKRABAQSAuyNjEgOTg6kTBdgAJewAEzaLi6B1P1LS3N4R9roRMQAADtcq5UKvmf3/uPhQtycHQCQMgCANF7vd8OAES39d4WAIhHaFQaAMIHAIjuPq4eAIhwAJANsrU2BEAUAADOe70vBwCc23pfDwC4EHdvGgCiG4CREOjhGwiAmQBg1PXwDHYHwMkCgIdHsHsAAC4ZACwCAigeALgPACDlTg2iAeCZAEDOwdGJtL7kffEAW/kAmMx+jx1JByjNAZDa/XtM9BEAtytAbuLvsTlrQAAAgrs12EtFGQAAEFgDAIYBOn1OAgCTCrCaQqcv59Lpq9cBUH0ANWT3w0EhP/8XAtEM8L/u17/5Z6EQAEgAhBgiH3kUFY4OZzjBGImJZjrJbMRcy3Ka9Qw2ju0srozdhyOFkMKZSjzPlc6dzpPJW8tPEcjelC14WaiedFgkd/N10VbxYxL5km3SJ2Rub+mUi5a/o9CjdFr5vsp71bNqZeqDmklaFdrDOmm6T/XG9DMMnhtO7sgyrjOZNb26q9FsYXeuRcue15avrdqsV2wL93bYddp3OXQ7offdc+7b339gwOX9wQ9uWPfHHp88P3sNe4/4fPEd9eciPwv4GjhJmaJOH5oJmg2ep80f/haycGQx9HvY0tEfx1bCV46vRkhHdkQjTiJjUKfQsQynGc9g4pjimRNYzrImYpPYzuGS8SnsqRxphPOc6cQMrkzuCzwXebP4svkvCVzedEXwqtA14RxSrsj1zTdE88TyxW9KFkjekiqUvi1ze7yIfEf2rlyxQoniPaX7Sg+UH24tVS1TK1t4FFKu/lijQqtS+8m2qm1PdZ6uVUfU6D3b/lz/hcFfhrXo2pi6HS+N600aTBtNm1iaEl6ZNZu3WLTiWs+9tmyzemPdTmhPfWvTYdu5t4u7K7Pb/p1Dj1Mvf292n3O/88D+90Lvr35wGTw4JDKU+9Htk/tnj2Hx4fwRry/eoz5j0mOF434T/l/Jk3KTd6cCpykz1Fml2ftzQfPB32gLqgtliyHfQ5fCfoQtay1XrhxbDV/TWXtKpwMgRJE45DSqCX2bIY0xHOPNZMtsyLKVVRIrycaL48HzsvNycBEkOKWIGlzm3Ad4gnmT+Ir5mwRGBTmF1IS9SRdEXooixHTED0nck5ySlpIhb6mUQ8nrK6QoDipLq8Ru7VKTUadq1GrxaIdue6XLrUfZ/txAzPCYUZuxkEnozirTJTMlc8/d6RZtljgrE+tQmzzbt3Ys9tsdDjledqrbN7Vf+MAel6MHc11r3UY9uDz1vBy8T/hc863x6/dfCuAM3EIxovocCg9KDs6llR6uD+k9Mha6cBR1jCOcdFz2hGrE9kizqD3R+04ejPE8RY6lnQ46ExkXGX8yIe5samJCUta5i8mZKSmpl9JSz2ekX8goyLx54e7Fgqzb2cWXnlx+cqX26qtrbTntue3X22/05n3KH7k5VPD51lThzO2posk7s3enisdLJu6N3B98MPSwp7StrOFRTfmjx8UVlypTn0RWBTzdV21Ws+2ZzHPC86UXH/5qrH1Yl/YyqN6mQa1RoJHe1PPqYXN8i1OraOvw6wdtx9/saMe197+91uHXqdK52tXcnfZuf490z1xvRV90v9kAcWDg/a0PwYPaQ+ihxo/nPx34LPl5YrhiJOrLrlGu0f6xG+PkCdWJta8Nk6lT+6bFpidmHsyGz5nME+a7v+UtUBY1v6O+v1xK+bFvWXT560rZauSaKZ2bTgeAk4hQ5FGUNqoCfZxBj6GaMQpzismYqZY5luU0azx2F7aJLRGXiE9i38PeypFMSOVMI6Zx2XK95c7gyeC9wJfFny2QvemSoLNgv9BV4WukHJGczTmi18VuiOdJ5EvelCqQviXjKzO2pVC2SO6O/F2FYsUSpXvK91UebH2oWqZWpl6mEarxXbNCq0K7ctsTnSrdE7pretXba/SfGTw3fGEUswO9o9a4zuTlznrThl2NZgnmWPNXu5stWva0WiZbsVu1Wb+xabd9u7fTLsOe277LodvxnVPPvmxnAee+/f0H3rt8OPjBNcdNxG3I/aPHJ8/PXvneEusJ4jfmf5ssS574txSZ+5Ui5WEaYUtHfxxbDl85vnpiLYIeBdHIX0mCOYOJY4priN+VwHoWm4hNYjuHT2ZP4fiVJdyZPBd4f2bJpj+zJHfouvsN0TyxfImbEhtpUiR7R+6u/B9ZolK6tUz1kXq5+mONCs1K7SfaVdue6lbr/pEjO+qMXxrXmzTsbDRtMnsV0rK51eK1ZZvlG6v24x0ynXZd9t3RPQq9Tn2xAyrv4wZVh85+8hjWHkkZ9R33+0qeoszEzzstnFtKWLWm0wHW9z4AAEY1gIwtAHZZADa5ALFbACRdALgLACzZAGw1AckgBEgdKiB26WzsH4AAdhAEeTAARwiGZCiB7wgSwgwRiihAtCBGkHikCTIKWYVcQemgolB1qBW0CNoRnY/+xmDMcIqhmGGK0YQxh3EYw4VxxlQxYZg0mWKYxpm1mCnMNSxyLJEs5aw41ijWd1giNhD7hW0H20m2QZwr7jkehffCT7BbsWewr3LEccwStAh5nOqceZxTRBfiIpcvVxn3Fu6XPF68GN5CPnG+I3zz/JcFTATmNl0TFBMMF0IIlQr7kURIPSLnN2/eHCmKF20VSxHfK8EvMSR5W8pQ6pa0gQyHzOCWB7Kn5ZzlVRSwCiOKfynlKkereGw1UZVV41RbUR/WyNTEadZolWjnbDuvc0Y3Qu/I9kP6ZANfQx8jnx3+xoEmtJ3HTGN2nTPLNr+1u9yiYU+f5Yw1xkbIVmOvjR3VPsnhruNrpzln3v26B7xckg9Wun5x5/Ew8QzzKvLl9bP0jyfXBiIp+tSoQy+CGWlmh1NDxcIoR5+Esxx3OlEUQY+yjUGeco59dIYz7lB8W2J60lKyS0pdmsL5rMzgCx+zbLJrr9y9Jp5z+TpPPvvNpFu4wnN3MosFS27clys1Kmsrd308U8XztKjG4AWtFl9XVL+rKb5ZrqXtdUh7XQe1S6C7vk+iv/t9/KDep6Jhjy/Coz1f7aa4p7tms+ZdFieWSpcj6Lx0OgAggQV4QBr0wAEOQzqUwwACg1BEuCCSENWIOaQM0gWZhXyLwqN2o86imtFs6D3odHQvA4nBl6GE4TujIeM5xncYccxhzAsmApMHUzkzK7Mz810WNMsBloesLKzurNVYLiwV28wmw5bINoEzxxXj2fAUfCf7dvYbHDiOEI5egjHhHieJM5VzjRhM/MrlxzXGTeae5aHxLPAe5UPwneXn5y8U0BSo22S3aVQwUohPqEzYSniMFCsiIVK/OVCUR/SpmLs4VvyZRKCksOQbqThpA+lVmcot4bI6soty1fJnFGwVRRSnlKqVU1T8thqpCqkuq3WoP9a4rBml5a1tv01HR0FXRI+wHa2P0p81mDGcMhrfMWw8ZzK+89supBnRnGe3koXunj2W1lb+1mE22bb3976y67VfcSQ6KeyzcD60/+KBWpcRV2Y3RXcfjyzPaq9pH2lfT79M/44AgcC9lGzqlyCp4BBaQ4jgkeDQxqOix5LCx044RtRHqUXnxRBOJZ0mnMmI503ITlRNakn2TPmRlpiunvH5wpUsv0t7r0hfY8iZuP48r/TmxVuxt93vOBcb39N4sLVU/pHcY6lK8SqpasVnei921lq9JDccakppvtb6pG2gnd4p3K3T49GXMFDxYeIj32eDkcjRgvFPk/zTXrNX5ocXpZYCl8vWEHQ6ADACOwiCAThCMpTAmw37G+7X1aPxaEf0NwZjhqyf3tcwzkzCTDFM48y2zDUsciyXWHGsUayL2EDsFzYPnCvuI94LP8EezL7KEUfgJuRxqnM2El2Ii1zJv0xb8M3/9GwphBAq/WnZal3yT8ch0gZ/Gv4t+KffN5o1WiW/7f6W+89u/5ta70FfXj/Lv6sN6fm72+jCP+WeVf4tN4Nxw+5lzQ29N9I2/BYRNgQ/KN8wXHlyXfGzng3HDaNN8a/+as5oaXsd8kawva6D2lnSFdtd3xPSJ9HvP2D0Pn5Qb+j0R7dPRZ8Xhtu/CI/6j5mOS01gvtpN5k/FTnvP7JyVmWOdm5x//e3BQsai7eLE95glgx+SP4aXI1Z4V66scqzGrC6u3aAn0OkA6+clAABgMaSQKUEkc0Oj//Ow978qgHx4Yw4kAGA9A/faAAABAKR8aaa2AEAEAC0wBAqQgQJBQAJzMASjn1cSuP964guwfpYDAGBkB7hkDwBQ/f1Y5N/npXmG0gAADCnUsCBfbx8aSZ9KJXuSDCkB1MM0zyBZkmmgu7wsSVlRURUA4F93RgACxGzQPQAAAAlwSFlzAAALEwAACxMBAJqcGAAAC39JREFUeJzt3W+MHHUdx/HP7Ozu7e1dDyjXq+215dBWSkhMbbWIEQ2JQhB5YuIjHxvQiCZijCFaCPGJJBgTYjD+4ZmAhCeikQQTkX+BAsWqTajU0BZ7Lb0eB1zvbu92dnZ8MPvr/m671/Y7O72e7fuV/LJ3u3e70wfz3t/8Zm4rAQAAAAAAAAAAAAAAAAAAAADQVXABn/98vzZwqUjO8b7cnI+dt/M5C979nY91uw/AmSVdvvbva57hsVzkudP6z1VQOwpudLvvfG4PcDFaKhr+aGpxPPyRi2JOzxN4ty4SYeu2c7jHO3/PvwXQXXOJ75tdRty6TXT6LKQneYSjc1bhB6M4NnZd5e7vPH7bFVes/XK51LctKBTXFoJgIIfXBSCpmSSzSbNxvB4t7H3vvWNP//wXX//jwYP7FpSGw41Ap89GMuv1Hd6PRuiNoqTSgw+8dvvG0Wt+/JF15bENm0INrymovz9QscTEAshLI0pUqyWaPNHUkXdivXt04fB/j751/90/+PRTkhpKw9FojVzi0cse3C0aRUnlarVafuhnb+4aHR25c/vOktaMhL1sIwCDExOx3ng10vj4xC/v+t6198/NzS0ojUaknOKRNRzu904dkkgqtUbfbx4+uGvzlnV33HBjWeVyoChKdGB/Q8fGY83MJIobWTcXQKewKA0OBlo3GmrL1qJKpUD1eqKXX6jrwFtHf/WNb330PqXRqLdGt7UPk17C4dY0ipLKSqNR+cn9z97+qU9+5uGbbu5TuRxo4nisPbsjVasFrR4uqtIfKAw5VAHyEseJ5muJpiYbmptrasf1JY2sDVWvJ3r2mQW9/vdXvvmjXTc9JWlBaTgitdc+MoWjcPYfOU3nQmhJrXgMD68f3Dy27Z7tO0unovHKi3Wt31DSxrGyBgYLRAPIWRgGGhgsaONYWes3lPTKi3VNHI9VLgfavrOkzWPb7hkeHh2U1Kf2/uqfxDDL9EstnfGofPuO3962fkP/xjUjoaIo0Z7dka66uqxVQ6xxAMth1VCoq64ua8/uSFGUaM1IqPUb+jfedecjtykNR1ntaGR+F88aDn9twx2q9I2OXvOlDZvSSBzY31C1WiAawDJbNRSqWi3owP50MXHDplDr12+5We0ZR0ntExqZrt7O61ClLKlvoDp03fCa9CmPjcdaPZzX9WUALFYPF3VsPJYkDa8paKA6dJ3aM45lP1Txr/B0xToVjmKpb7i/P/2RmZlElX7WM4ALodIfaGYmvUg0vXaqb1hSRe0TGUUt/jMQk15nHK5cRUnlsBD2u4u74oZYCAUukDAMTl32UCwFCgthv9qHKS4a/p+BmPQSDj8ebtYBYOXyD1PcoYpjikfWcLhSLbpiNMNzAVg+brbRucaxLDMOaXE8/LMrAFYuPxpn+niLs+plcdQ/XMm8Ogtg2XR+1IX/pyMmec04Oo+XAKw8nYcnmS8Cy7rG0e17wgGsfEt9iFamJ8nqbB8FCGDlONPn/2Z6oqz4yD/g/0/P+y2HF8ClI7c3eMIBwKzXP6sHcAnK86wKIQFWvs6zKlri+3N6EivOogAXh2X761gAlzjCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwIxwAzAgHADPCAcCMcAAwyyMcSQ7PAWB5JB23mWQNRyKp2csLA1gREmWISJZwLPUizDyAlS+X/Zc1DgBmhAOAWa/h8Kc3SSNuzDei9K6wKMUxRy/AhRDHicJi+nUjStSIG/PKaWFU6n2Nw33dlKSF+ZkPa7X0rsHBQPM1wgFcCPO1RIODgSSpVku0MD/zoRaHwx9mvZxVcaPpbienxg9NnkhPtqwbDTU12cj49AB6MTXZ0LrRUJI0eaKpyanxQ0r3Vbe/Zo6GZA9Htxc6FY5/7fvbG0feiSVJW7YWNTfX1MnpOOu2Acjg5HSsubmmtmxNj1WOvBNr377n9mjxG70fjmU5HeteyK9XQ1L82BP3vXbo7anJExOxSqVAO64v6fDBOvEAlsnJ6ViHD9a14/qSSqVAJyZiHXp7avLRJ3btUWs/bY2eZh2h8eeD1ghbo9QaZUl9jUZUrlSH5tdeecOOTWOhhi4r6IorC3rrzUi12aaKxUBhKBUKQZZtBdBFHCeqzSU6fjTS1Huxdn62rJG1oer1RC8/X9eTf3jod3v3/uWApFlJNUnzrRG1hgvJOStm3FZ/fSNWWrKGpPpjj9/7+sfGtn280n/LF264Mf0HfPHWgg7sb+jYeF0zM4lilj6A3ITF9GTEutFQW7b2qVQK0mi8UNeLLz3z3GOP3/u62pFwsw53xJCJ9a0/UHp4U5TUJ6kiaUDSoKTLW2N1oVBY/cPvP/nVz9946+e27yxpzYh1YgMgqxMTsd54NdJzz//5pZ8++LUnm83m+5LelzQlaVrSSbVnH3WlMXHLDuckyx7t4uGPoj+SJAlfeOn3h2dr0fuF5rWjJ6crlWZTKhalsCAVQg5VgLw0okSzs4mOHom17x+Rdr/87gePPvHAU79+5Lt/TZJkRpI/apIWlAbDHaaYoiHZZxzud4pqr230S6oqnXUMSbpM6cxjlaRV5XJl6Cu33vWJbdtuvmZ03eaRavXygXKpr5ThdQF0UY8Worm5D2bHj/1nYu/eZ/79p6cf+me9Pj+tNBQfeuOk2rONBbUDYl7jyBoOf3G0ojQcVbVi0RpDrduB1mN9reFmJgXv9TtvAXTnr0v464xuBlFrjVm1QzHdGjNqH6K4aJgPU6R8FkcbrQ1whywuCIHap2rrSgNTVhob/+f4exnAxr9i251ejZTuZwuS5pQGYlbdY+F+J/PiaJZwuGAE3ga7CIRqB8NFw02JKmqfvnUzFj8yAM7Oj4b/5u2Ho6Z2PNztvLqvbZhnG1L2GYf7B7jiuXjUWo+5jYnUDkefFofDLawSDsDGn/H7+2C9NebVPmSZVxoPtx/6p2MzX3Ley6GKm+YErY0JOh53/5gFpRvvDlP82QbhALJpanE4Tl1LpXY8Om8j72f9S8/NeplxSN2PkVw03PSprHSjXTTc+oY7rJG6h4OYAKluf5HuvnaHKk21L/ByF3stqD0TaXiP9RQNqfdDlUBLr/LGSmNRb71O6N36Mw0WRwEbf53DRcDtc34gGt7onGn09JnBebyru+fwF0j9UVT3wxP/dGxe2wJczDpnCN3WOvw3bhcN/3Ephw8az2tn7YyHHxH/ClP/qlOJ2QaQVefZFT8gLhKd90k5REPK/13eD4i79b8OuvzM+dwe4GLTbb3DD4d0ekyknILhnK8d1X/eQsf9Sy2IEg3gzJZazOxcZ+wMSu6Wa2c92+sQDcCG/98IAAAAAAAAAAAAAAAAAAAAALAS/Q8LAUdRAb/LqgAAAABJRU5ErkJgggo=) no-repeat -10px -138px; +} + +form#recordFilterSearchForm { +} + +input#recordFilterSearchValue { + width: 200px; +} + +/* @end */ + +/* @end */ +/* +div#mainContent { + padding-left: 15px; +} +*/ +div#recordListAndDetailBlock { +} + +table#recordListAndDetailBlockTABLE { + width: 100%; +/* background: url(../images/cardBlockLowerBorder.gif) repeat-x 0 bottom; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhBwAZANUAAP///6qq7tzc+OLi+eXl+vz8/v7+/9/f+dnZ9/b2/fr7/vT0/fv7/vLy/Ojo+vj5/vT1/dnZ+Ovq++3t+/n5/e3t/Orq+/n5/u7t/Orr+/Dv/PPy/PLy/e/v/OXk+tna9/38/uvq+ufn++Df+P7+/vX1/fj5/fz9/+jo+9/f+Ojn++/w/P79//v6/vb3/efo+u3u/Pf3/ejn+vDw/PDw+/X0/e/w+/f2/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAHABkAAAZoQIBwSCwaj8ikEkAyOFnOAqhALZwYCkZLkaVQHpfLw+SKJRK3M2RRKy0WkA2H06hvNDMbbdXRVCYYMBUYExYSIRkSGRYiMi8qDg4oBJSVHgOYmQMpIweengKhogIIEREIHwgIAaytAUEAOwo=) repeat-x 0 bottom; +} + +td#recordDetailSeparatorTD { + border-bottom: 1px solid #aaaaee; +} + +table#recordListAndDetailBlockTABLE tbody tr td { +} + +div#recordListBlockHeader { + background-color: #333366; +/* border-bottom: 2px solid #aaaaee; */ +} + +div#recordListBlockHeader table.recordListBlockHeaderTABLE { + width: 100%; + height: 30px; + color: white; +/* background: url(../images/cardsBlockRoundCorners.gif) no-repeat right -51px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhCQBkALMMAP///z8/b7e3yaKiufX19zQ0Zzw8bVxchaSkuz4+bltbhDk5av///wAAAAAAAAAAACH5BAEAAAwALAAAAAAJAGQAAARTEEhAhgplimCYl8jijYAwnkRwjkO3MsfrJTJT1Hiu73zv/8CgcEgsGo/IpHJZKyQOA8IEMDIEBJMXQvJaYGUBgswwqClqKtmNyW673/C4fE4/RgAAOwo=) no-repeat right -51px; +} + +div#recordListBlockHeader table.recordListBlockHeaderTABLE tbody tr td.recordBlockTitleTD { +/* background: url(../images/cardsBlockRoundCorners.gif) no-repeat left 0px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhCQBkALMMAP///z8/b7e3yaKiufX19zQ0Zzw8bVxchaSkuz4+bltbhDk5av///wAAAAAAAAAAACH5BAEAAAwALAAAAAAJAGQAAARTEEhAhgplimCYl8jijYAwnkRwjkO3MsfrJTJT1Hiu73zv/8CgcEgsGo/IpHJZKyQOA8IEMDIEBJMXQvJaYGUBgswwqClqKtmNyW673/C4fE4/RgAAOwo=) no-repeat left 0px; +} + +/* +table#recordListButtonsTABLE { + width: auto; + margin-right: 10px; + position: static; + float: right; +} +*/ +div#recordListBlockHeader table.recordListBlockHeaderTABLE h3 { + color: white; + padding-left: 10px; + padding-top: 3px; +} + +div#recordListBlock h3 { + padding: 8px 0px 2px 10px; +/* margin-right: 8px; */ + color: #666666; +} + +div#recordListBlockHeaderButtons { + padding-top: 5px; + padding-right: 0px; +} + +div.recordButton { + padding: 2px; +} + +td#recordDetailSeparatorTD { + width: 1px; +} + +ul#records { + margin-top: 6px; + list-style-type: none; + padding-bottom: 15px; +} + +ul#records li { + list-style-position: inside; + padding: 1px 5px 1px 8px; + border: 1px solid white; + color: #35306b; +} + +ul#records li.hover { + color: #ff9400; + border: 1px solid #f5f5ff; + border-top: 1px solid #aaaaee; + border-bottom: 1px solid #aaaaee; + background-color: #f5f5ff; +} + +ul#records li.selected { + background-color: #ddddff; + color: #ff9400; + border: 1px solid #ddddff; +/* border: 2px solid #35306b; */ +/* border-right: 1px dotted #333366; */ + padding: 1px 6px 1px 8px; +/* background-color: #35306b; */ +} + +ul#records li span { + color: #35306b; + text-decoration: none; + line-height: 16px; + font-size: 10pt; + cursor: pointer; +} + +ul#records li.selected span { +/* color: white; */ + color: #333366; +} + +/* @group Bottom rounded corners */ + +td#cardBoxLowerLeftTD { +/* background: url(../images/cardBlockLowerRoundedCorner.gif) no-repeat left -32px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhCQBkANUyAP////Ly/PDw/O3t/OLi+ejo+vz8//n5/urq++Xl+tzc+Ovr+/z8/t/f+Pv6/vb3/fT0/f7+//v7/vT1/efo+/79/8vL9fr6/uXl+e3t+/3+/9jY9/b2/vX1/d/f+ff2/fb2/fj5/uHh+dnZ+OLi+rOz8NnZ99vb+LKy7/r7/6ur7sDA8vLy/f7+/vn4/u/w/Pj4/vX0/P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADIALAAAAAAJAGQAAAb3QJlwSCwaj8ikcslsOp/QqHRKfQKu2Kx2y+16v+BtRFNpjSuRisHAYKzdDMfFIZE7UpfQYa8/wFwfDyAcgSAPHB0QExCJExMxAZGSkSwClpeWLwObnAMZGQsLCAiipAgUFAUFqaoFGwkJGLCyGBIEBCS3uQQAIhYNwA0eHlcnFgrIyFgiJRYmIyNZEhsrKCpV2Nna29zd3t9h4eLj5FdoFRoRLegRcG9uBhcpdnVzLjB8ewchHIIPHxwMfYjhiJEiRiwmTXqBCdOnTpxMSQzVapUqVLRmwdqgqyMBCcOCNbAgAkAyZBZOXIFmwkKJkldUoFixQUKWIAA7Cg==) no-repeat left -32px; +} + +td#cardBoxLowerRightTD { +/* background: url(../images/cardBlockLowerRoundedCorner.gif) no-repeat right -82px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhCQBkANUyAP////Ly/PDw/O3t/OLi+ejo+vz8//n5/urq++Xl+tzc+Ovr+/z8/t/f+Pv6/vb3/fT0/f7+//v7/vT1/efo+/79/8vL9fr6/uXl+e3t+/3+/9jY9/b2/vX1/d/f+ff2/fb2/fj5/uHh+dnZ+OLi+rOz8NnZ99vb+LKy7/r7/6ur7sDA8vLy/f7+/vn4/u/w/Pj4/vX0/P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADIALAAAAAAJAGQAAAb3QJlwSCwaj8ikcslsOp/QqHRKfQKu2Kx2y+16v+BtRFNpjSuRisHAYKzdDMfFIZE7UpfQYa8/wFwfDyAcgSAPHB0QExCJExMxAZGSkSwClpeWLwObnAMZGQsLCAiipAgUFAUFqaoFGwkJGLCyGBIEBCS3uQQAIhYNwA0eHlcnFgrIyFgiJRYmIyNZEhsrKCpV2Nna29zd3t9h4eLj5FdoFRoRLegRcG9uBhcpdnVzLjB8ewchHIIPHxwMfYjhiJEiRiwmTXqBCdOnTpxMSQzVapUqVLRmwdqgqyMBCcOCNbAgAkAyZBZOXIFmwkKJkldUoFixQUKWIAA7Cg==) no-repeat right -82px; +} + +/* @end */ + +/* @group New record panel */ + +div#newRecordPanel { + position: absolute; + margin-left: 20px; + width: 400px; + height: 160px; +} + +div#newRecordInnerPanel { + width: 400px; + height: 160px; +/* background: url(../images/newRecordPanelBackground.png) no-repeat 0 -165px; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat 0 -165px; +} + +div.newRecordInnerInnerPanel { + background-color: white; + padding: 0px; + margin-left: 23px; + margin-right: 25px; +} + +div#newRecordPanel h2 { + color: #666666; + font-size: 12pt; + font-weight: bold; + padding: 5px 10px; +} + +div#newRecordPanel table#newRecordPanelDataTABLE { + width: 340px; + color: #999999; + padding-bottom: 5px; +} + +div#newRecordPanel table td.newRecordPanelLabelTD { + padding-left: 10px; + padding-top: 3px; + font-size: 9pt; + width: 100px; +} + +div#newRecordPanel table td.newRecordPanelLabelTD span { + font-size: 8pt; +} + +div#newRecordPanel input { + width: 100%; +} + +/* +div#newRecordPanel textarea { + width: 100%; + height: 50px; +} +*/ + +div#newRecordPanelButtonsBox { + border-top: 1px dotted #333366; + padding-top: 5px; +} + + +div#newRecordPanelButtonsBox table#newRecordPanelButtonsBoxTABLE { + width: 100%; +} + +div#newRecordPanelButtonsBox table tbody tr td.newRecordPanelButtonTD { + padding-right: 10; +} + +/* @end */ + +/* @end */ + +/* @group Record detail */ + +div.recordDetailDataBox { + padding: 0px; + padding-top: 5px; +/* padding: 0px 0px 0px 10px; */ +} + +div#recordDetail { + border-top: 4px solid #ddddff; +} + +div#recordDetail table.recordDetailDataBoxTABLE { + width: 100%; +} + +div#recordDetail form table tbody { + color: #35306b; + font-size: 10pt; +} + +div.recordTitleBlock { + color: #666666; + padding: 8px; + font-size: 12pt; +} + +div.recordTitleBlock h2 { + color: #333366; +} + +form.processingRecordFORM div.recordTitleBlock { + color: #444444; + background-color: #ddddff; + padding: 8px; +/* margin-right: 8px; */ + font-size: 12pt; +} + +form.recordDataForm div.recordTitleBlock { + color: #444444; + background-color: #ddddff; + padding: 8px; + font-size: 12pt; + +/* margin-right: 8px; */ +} + +div.recordTitleBlock input { + width: 100%; +} + +span.noteFieldLabel { + display: block; + color: #cccccc; + font-size: 8pt; +} + +div.noteFieldContent { + color: #666666; + font-size: 8pt; + padding: 3px 0px 5px 0px; +/* border-bottom: 1px dotted #333366; */ + margin-bottom: 5px; +} + +.resizable-textarea { +/* width: 95%; */ +} +.resizable-textarea .grippie { + height: 5px; +/* background: #eee url(../images/grippie.png) no-repeat center 1px; */ + background: #eee url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAFCAMAAACD1meMAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAGUExURbu7u////3iwjPUAAAACdFJOU/8A5bcwSgAAABRJREFUeNpiYMADGHEDBhroAwgwAA9QADeT0qnSAAAAAElFTkSuQmCCCg==) no-repeat center 1px; + border: 1px solid #ddd; + border-top-width: 0; + cursor: s-resize; +} + +div.noteFieldContent textarea { +/* margin-right: 10px;*/ + font-size: 8pt; + width: 100%; + height: 50px; +/* color: #666666; */ +} + +div.noteFieldContent div.viewMode { +/* max-height: 100px; */ + overflow: auto; +} + +tr.recordFieldsTR { + background-color: #ff9400; /* #ffc880 */ +} + +tr.recordFieldsTR td { + padding: 2px 0px 1px 0px; + color: white; + font-size: 9pt; + border-bottom: 6px solid white; +/* border-left: 1px solid white; */ +} + +div.Clipperz_recordFieldLabel { + color: #999999; +} + +div.Clipperz_recordFieldLabel input { + font-size: 10pt; + width: 100%; +/* color: #666666; */ +} + +div.Clipperz_recordFieldData { + color: #666666; +} + +div.Clipperz_recordFieldData a { + color: #333366; +} + +div.Clipperz_recordFieldData input { + font-size: 10pt; + width: 100%; +/* color: #666666; */ +} + +/* +td.removeFieldButton { + padding-left: 10px; +} +*/ +/* +div.addFieldButton { + padding-left: 8px; +} +*/ + +td.fieldTypeTD { + width: 70px; + color: #999999; + white-space: nowrap; + overflow: hidden; + text-align: right; +} + +td.fieldTypeTD select { + min-width: 68px; + width: 68px; + font-size: 10pt; +} + +table.recordDetailButtonsTABLE { + width: 100%; +} + +/* @group Scrambled value */ + +div.Clipperz_recordFieldData a.scrambleLink { + display: block; + text-align: left; + font-size: 8pt; + text-decoration: none; + color: #ff9400; +} + +div.Clipperz_recordFieldData div.passwordBackground, div.passwordEntropy { +/* background: url(../images/entropyBackground.gif) repeat-x 0 0; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAQCWAOYAABb8Ev9KAP81AP8hABvxAP86AP95AP9qAP8FAP8HAP9QAP9SAP9wAPCGAP8PAP9jAP8XAP9EAP88AP8+AP9UAP9bAP8bAP8JAP8tAP9WAAj6AAv5AP8rAP8fANSUAP8zANGWAMScAP9AAA/3AP8lADvhAF7PAOyIALGmAI23AC/nAJG2ADPlAHXDAOSMAEfbACfrAL2gAKGuAP8RAM2YAIW8AP9YAMiaAIG+AELdAHrBAGbLAP8ZAP99AD7fABfzAKWsAP9mAP9IAP9GAPuBAP8jAMGeAP9rAP9xAP9CAP8TAP8vADfjAP8VABT0AP9OAPiDAP8dAP9gAFbTAKmqAP9oAPSEAP9iANyQAJW0AJ2vAIq6AP8TEh/vALWkAP91AH6/AP9MAP84AP94AE7XAP82AP8LAP8oAP97AGLOANiSAG7HAP8wAFrRAP8DAOCOAP9tAP9zAP9aAP8nAP8NAGrJAOiKAHHGAFLVAJmyAK2nACPtALmiAErZAP9eACvpACH5BAAAAAAALAAAAAABAJYAAAeJgFxuCAkXZnQOM0pNEDwWUR0DRSRzZxwYS2wfAmViBRITIkkRQ0IBYU8KCxQZNnIVflJXD0FVB0dwDEhxX2MGaD1EUFYNJ3Yub1hqHiA0NyFGMXxeKHpUQDJaeVkrKVs1OGA6LXdrdTtpJm1TeGR9Lzk+JUwsKn8we10EP04jGxoAAgocSLBgwEAAOwo=) repeat-x 0 0; +} + +div.Clipperz_recordFieldData input.scrambledField { + font-size: 1pt; + + width: 71px; + height: 16px; + color: white; + padding-top: 4px; + border: 0px solid white; +/* background: transparent url(../images/scrambledValue.png) no-repeat 0 0px; */ + background: transparent url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAEcAAAAgCAYAAABAQWX9AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAANXSURBVHja7FgxixNBFJ6TEyFXxEBiYWFEuCKHcEJio6RRIZAycF3qjWU67xcEr0par04Q7mA7hSAWErVyC1GTIiAmoMUlcHeFQblC53uZWTbJzmZ3cazmwUBm5+ObN9978zb7Nv5wY8Z87ZKRwIjz78SZTqes2+2ywWAQiqTX6xE+jOnkjoE/5OMgkjiTyYTZts3G43GoHRzHIXwY08kdA3/Mx/5acRDR2WymZBmNRoHz5ezwcunkjoF3AsT6ysepnGzKH1AbqufzeZZOp91N2+02PYc1m033eaPRIBzwcnOkM7BYr1QqrFQqaeeOiMdmBT5u8bHnEeJAZBHWn/LxZEGcbDZLKktnZYrCvBsnEgl6ViwWad17v2U6e0XQzR0DbwkhvLVGXq09IRzZxvL/HCjdarXcCFSrVdpcZYg+iqAUoV6vu4f0uz66uGPga6Igk4Z8vOIjFViQQQ7npdNyrjosIgYHECE5D3qT6OKOiHdE9qREtsi5+m0FMjicy+Uoqrir2ERV/TudDh3OsizCwzFg/QqkTu4Y+JqoN0d8PBMi7S8X65XMwf0EOQxFDIfJZDIr7HAEWImBM3DMD6ubOyL+VNQVFN1HQpgjb61R1hxj5vPBiGPE0WibL/tGBJM5Rpz/IM7P8ykbfuiyyThcz+Xb5x7hw5hO7hj46P2c2fmE9d/Z7OwkXM/lx9AhfBjTyR0Df1zeCdHPQUQvfqt7Lmcno8D5cnZ4uXRyx8BH7+dAbah+fTvPtpJpd9OPr9vs+3DOV37cdJ+/ed4gHPAXv+abI53BgfWd+xW2XShp546Id3imFPgb2refw9ccvrbaz7l6LctTfkqE3hSFuRvzCFy+Mm8B3LxdpIN577dMZ68Iurmj4vnhLSGEW2vk1eJri/2cF18Wv62g9Hu75abi7sMqba4yRB9FUIpwr1J3D+l3fXRxx8DXuCiHQpRw/ZzRpx45L52Wc9VhETE4gAjJubLnopE7Ip76N1yUFLIF12ltPwepDuUzN3IUVdxVbNJ/aysi1aHD3S1b7A7HwzFg/QqkTu4YeGSN28+BSKH6Obifuw/mPRcUMRwmkVzti8CRBMdKDJyBY1tJdT9HF3dEPPVzuCDr+znLNceY+Xww4hhxNNpfAQYAoVB5BoFW//8AAAAASUVORK5CYIIK) no-repeat 0 0px; +} + +div.Clipperz_recordFieldData input.scrambledField:focus { + color: #b5d5ff; + border: 0px solid white; +/* background: transparent url(../images/scrambledValue.png) no-repeat 0 -16px; */ + background: transparent url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAEcAAAAgCAYAAABAQWX9AAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAANXSURBVHja7FgxixNBFJ6TEyFXxEBiYWFEuCKHcEJio6RRIZAycF3qjWU67xcEr0par04Q7mA7hSAWErVyC1GTIiAmoMUlcHeFQblC53uZWTbJzmZ3cazmwUBm5+ObN9978zb7Nv5wY8Z87ZKRwIjz78SZTqes2+2ywWAQiqTX6xE+jOnkjoE/5OMgkjiTyYTZts3G43GoHRzHIXwY08kdA3/Mx/5acRDR2WymZBmNRoHz5ezwcunkjoF3AsT6ysepnGzKH1AbqufzeZZOp91N2+02PYc1m033eaPRIBzwcnOkM7BYr1QqrFQqaeeOiMdmBT5u8bHnEeJAZBHWn/LxZEGcbDZLKktnZYrCvBsnEgl6ViwWad17v2U6e0XQzR0DbwkhvLVGXq09IRzZxvL/HCjdarXcCFSrVdpcZYg+iqAUoV6vu4f0uz66uGPga6Igk4Z8vOIjFViQQQ7npdNyrjosIgYHECE5D3qT6OKOiHdE9qREtsi5+m0FMjicy+Uoqrir2ERV/TudDh3OsizCwzFg/QqkTu4Y+JqoN0d8PBMi7S8X65XMwf0EOQxFDIfJZDIr7HAEWImBM3DMD6ubOyL+VNQVFN1HQpgjb61R1hxj5vPBiGPE0WibL/tGBJM5Rpz/IM7P8ykbfuiyyThcz+Xb5x7hw5hO7hj46P2c2fmE9d/Z7OwkXM/lx9AhfBjTyR0Df1zeCdHPQUQvfqt7Lmcno8D5cnZ4uXRyx8BH7+dAbah+fTvPtpJpd9OPr9vs+3DOV37cdJ+/ed4gHPAXv+abI53BgfWd+xW2XShp546Id3imFPgb2refw9ccvrbaz7l6LctTfkqE3hSFuRvzCFy+Mm8B3LxdpIN577dMZ68Iurmj4vnhLSGEW2vk1eJri/2cF18Wv62g9Hu75abi7sMqba4yRB9FUIpwr1J3D+l3fXRxx8DXuCiHQpRw/ZzRpx45L52Wc9VhETE4gAjJubLnopE7Ip76N1yUFLIF12ltPwepDuUzN3IUVdxVbNJ/aysi1aHD3S1b7A7HwzFg/QqkTu4YeGSN28+BSKH6Obifuw/mPRcUMRwmkVzti8CRBMdKDJyBY1tJdT9HF3dEPPVzuCDr+znLNceY+Xww4hhxNNpfAQYAoVB5BoFW//8AAAAASUVORK5CYIIK) no-repeat 0 -16px; +} + +div.Clipperz_recordFieldData span.scrambledFieldLabel { + display: block; + color: #999999; + font-size: 11px; + padding-left: 10px; +} + +/* +div.passwordTooltip { + position: absolute; + padding: 30px 30px 30px 40px; + font-size: 10pt; + font-weight: bold; + color: black; + background: url(../images/tooltipBackground.png) no-repeat 0 -30px; + width: 335px; + height: 148px; + z-index: 10000; +} +*/ +/* @end */ + +/* @group Editing mask */ + +div#recordDetailEditModeHeaderMask { + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 119px; + z-index: 20000; + overflow: hidden; +/* + border: 10px solid red; +*/ +} + +div#recordDetailEditModeVerticalMask { + width: 511px; + position: absolute; + top: 119px; + left: 0px; + z-index: 20000; + overflow: hidden; +/* + height: 100%; + border: 10px solid red; +*/ +} + +/* @end */ + +/* @group Direct logins (record detail) */ + +div.directLoginsRecordBox { + margin: 10px 0px 10px 0px; + border-top: 4px solid #ff9400; /* #ffc880 */ + border-bottom: 4px solid #ff9400; /* #ffc880 */ +} + +div.directLoginsRecordBox textarea { + color: #666666; +} + +div.recordDetailNoDirectLoginDescriptionBox { + padding: 5px 5px 0px 5px; +} +div.directLoginsRecordBox p { + font-size: 10pt; + color: #999999; + padding-bottom: 5px; +} + +div.directLoginDetailTitle a { + color: #333366; + font-size: 10pt; + font-weight: normal; +} + +div.directLoginDetailTitle input { + width: 100%; +} + +div.recordDetailDescriptionBox { + padding: 10px 10px; + color: #666666; +} + +div.recordDetailDescriptionBox h5 { + padding: 10px 10px; + padding: 5px 0px 10px 0px; +} + +div.recordDetailDescriptionBox p { + color: #999999; + padding-bottom: 10px; +} + +div.recordDetailDescriptionBox a { + color: #333366; +} + +div.directLoginsRecordBox h3 { + color: #666666; + padding: 5px 0px 0px 5px; + margin: 0px 0px 5px 0px; + font-size: 12pt; +} + +div.directLoginsRecordBox span { + color: #999999; +} + +table.directLoginBindings { + width: auto; + padding-top: 10px; + padding-bottom: 5px; +} + +table.directLoginBindings td.directLoginBindingLabelTD { + padding-right: 20px; +} + +table.directLoginBindings td.directLoginBindingLabelTD span { + font-weight: bold; + color: #bbbbbb; +} + +table.directLoginBindings td.directLoginBindingValueTD span{ + color: #999999; +} + +table.directLoginBindings td.directLoginDataLabelTD { + padding-right: 20px; +} + +table.directLoginBindings td.directLoginDataLabelTD span { + color: #bbbbbb; +} + +table.directLoginBindings td.directLoginDataValueTD span{ + color: #999999; +} + +div.directLoginsRecordBox ul { +} + +div.directLoginsRecordBox ul li { + padding: 5px 0px 5px 0px; + border-top: 1px dotted #ff9400; +} + +div.directLoginsRecordBox ul li span { + font-size: 10pt; + padding-left: 5px; +} + +div.directLoginsRecordBox ul li a.directLoginFavicon { + width: 16px; + height: 16px; +} + +div.directLoginsRecordBox div.addDirectLoginBox { + border-top: 1px dotted #ff9400; + padding: 5px 0px 10px 0px; +} + +div.directLoginsRecordBox div.addDirectLoginBox div.addDirectLoginBoxContent { + padding-left: 35px; +} + +/* +div.directLoginsRecordBox div.addDirectLoginBox textarea { + width: 80%; + height: 50px; + margin-left: 30px; + margin-bottom: 10px; +} +*/ + +div.directLoginsRecordBox div.addDirectLoginBox div { +/* margin-left: 30px; */ +} + +/* @group toogle button */ + +div.directLoginCollapseLink { + display: inline-block; + width: 15px; + height: 15px; + cursor: pointer; +/* background: url(../images/directLogin/toggle.png) no-repeat; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat; + overflow: hidden; +} + +div.directLoginCollapseLink.collapser-collapsed { + background-position: 0px 0px; +} + +/*div.directLoginCollapseLink.collapser-collapsed.hover {*/ +div.directLoginCollapseLink.hover { + background-position: -13px 0px; +} + +div.directLoginCollapseLink.collapser-expanded { + background-position: 0px -13px; +} + +div.directLoginCollapseLink.collapser-expanded.hover { + background-position: -13px -13px; +} + +/* @end */ + +/* @end */ + +/* @end */ + +/* @group Record creation wizard */ + +div.recordCreationWizard { + padding: 10px; +} + +div.recordCreationWizardTitleBox { + padding-bottom: 5px; + border-bottom: 1px solid #ff9400; + margin-bottom: 10px; +} + +div.recordCreationWizardTitleBox h5 { + padding: 5px; + color: #666666; + font-size: 13pt; +} + +div.recordCreationWizardTitleBox p { + padding: 5px; + font-size: 10pt; + color: #999999; +} + +/* +div.recordCreationWizard ul { + padding: 5px; + list-style-type: none; + list-style-position: outside; +} + +div.recordCreationWizard ul li h4 { + font-size: 11pt; + font-weight: bold; + color: #ff9400; + text-decoration: none; + padding-bottom: 2px; + cursor: pointer; +} + +div.recordCreationWizard ul li table tr td { + font-size: 9pt; + color: #999999; + padding-left: 5px; + padding-bottom: 10px; +} +*/ + +div.newRecordWizardHeader { + margin-top: 10px; + border-top: 3px double #ff9400; + padding-top: 5px; +} + +div.newRecordWizardFooter { + border-top: 1px solid #ff9400; + padding-top: 5px; + padding-bottom: 5px; + border-bottom: 3px double #ff9400; +} + +/* +div.recordCreationWizard ul li table input { + margin-top: 3px; +} +*/ + +/* @end */ + +/* @end */ + +/* @group Account page */ + +div#changePassphraseBlock form table.panelBody tbody tr td { + vertical-align: top; + height: 25px +} + +div#changePassphraseBlock form table.panelBody tbody tr td span.formLabel { + line-height: 20px; +} + +div.panelBody form table.panelBody { + padding: 10px; + color: #999999; + font-size: 10pt; + line-height: 9pt; +} + +div.panelBody form table.panelBody span.formLabel { + padding-right: 5px; +} + +div.panelBody form table.panelBody tbody tr td input[type=text] { + width: 250px; +} + +div.panelBody form table.panelBody tbody tr td input[type=password] { + width: 250px; +} + +div.panelBody form table.panelBody tbody tr td input { + margin-right: 10px; +} + +div#deleteAccountBlock { + height: 200px; + min-height: 200px; +} + + +/* @end */ + +/* @group Tools page */ + +/* @group Bookmarklet */ + +a.bookmarkletLink { + display: block; + margin: 0px 0px 0px 35px; + padding: 15px; + color: #333366; + font-weight: bold; + border: 1px dotted #6666aa; + width: 200px; + text-align: center; +} + +div.bookmarkletConfiguration { + padding-bottom: 10px; +} + +div.bookmarkletConfiguration p { + color: #666666; + display: block; + padding-top: 5px; + font-weight: bold; +} + +div.bookmarkletConfiguration textarea { + color: #666666; + font-size: 8pt; + width: 300px; + height: 100px; +} + + + +/* @end */ + +/* @group Compact link */ + +div#compactLinkBox a { + display: block; + margin: 10px 0px 10px 0px; + padding: 15px; + color: #333366; + font-weight: bold; + border: 1px dotted #6666aa; + width: 200px; + text-align: center; + font-size: 12pt; +} + + + +/* @end */ + +/* @end */ + +/* @group Exit */ +/* +div#exitBlock { + padding: 10px 30px; + width: 60%; + color: #999999; +} + +div#exitBlock h2 { + padding-bottom: 5px; +} + +div#exitBlock h3 { + padding-top: 20px; + padding-bottom: 5px; +} + +div#exitBlock ul li ul { + padding-left: 20px; + list-style-type: disc; +} + +div#exitBlock ul li ul li { + color: #ff9400; + padding-bottom: 5px; +} + +div#exitBlock ul li ul li span { + color: #999999; +} +*/ +/* @end */ + +/* @end */ + +/* @group Yui-Ext customization */ + +div.ydlg-dlg-body { + background-color: white; +} + +/* @group Splash dialog */ +div#alert div.ydlg-dlg-body { + background-color: white; +} + +div#splashMessage { +/* border: 4px solid #ff9400;*/ +/* border-bottom: 1px solid #ff9400; */ + padding: 10px; + color: #666666; + background-color: white; +} + +div#splashMessage p { + margin-bottom: 0px; + font-weight: normal; +} + +div#splashMessage p a { + color: #333366; +} + +div#splashMessage ul { + list-style-type: disc; + list-style-position: outside; + padding-bottom: 10px; +} + +div#splashMessage ul li { + margin-left: 20px; + padding-bottom: 5px; + color: #ff9400; +} + +div#splashMessage ul li p { + display: inline; + font-size: 10pt; + color: #999999; +} + +/* @end */ + +/* @end */ + +/* @group subMenu */ + +ul.subMenu { + width: 200px; + min-width: 200px; + max-width: 200px; + + color: #35306b; + padding-top: 10px; +} + +ul.subMenu li { + padding: 5px 10px 5px 10px; + cursor: pointer; + border: 1px solid white; + font-size: 10pt; +} + +ul.subMenu li.hover { + border: 1px dotted #ff9400; +} + +ul.subMenu li.selectedTab { + background-color: #ff9400; + border: 1px solid #ff9400; + color: white; +} + +/* @end */ + +/* @group tabPanels */ + +li.hiddenPanel { + display: none; +} + +div.clipperzSubPanel { + color: #35306b; + padding-left: 10px; + border-left: 4px solid #ff9400; + min-height: 200px; +} + +div.clipperzSubPanel span.read-only { +/* background-image: url(../images/read-only_background.png); */ + display: block; + color: #666666; + padding: 10px; + font-weight: bold; +} + +div.clipperzSubPanel h5 { + border-bottom: 1px dotted #ff9400; + padding: 10px; + color: #666666; +} + +div.clipperzLoginForm form h5.errorMessage { + margin: 0px 20px; + padding: 10px 10px; + color: #ff9400; + border-bottom: 1px dotted #ff9400; + font-size: 12pt; +} + +div.panelBody form h5.errorMessage { + color: #ff9400; +} + +div.clipperzSubPanel div.clipperzSubPanelButtonBox { + border-top: 1px dotted #ff9400; + padding: 10px; +} + +a#printingLink, a#offlineCopyLink, a#exportLink { + color: #333366; + font-weight: bold; + padding: 10px 10px 10px 10px; +} +/* +div.clipperzSubPanel a { + color: #333366; + font-weight: bold; + padding: 100px; +} +*/ + +tr.openPreferenceBlock div.preferenceBlockTitle { + padding: 10px 0px 0px; +} + +tr.openPreferenceBlock div.panelDescription p { + padding-bottom: 0px; +} + + +div.preferenceBlockTitle { + padding-bottom: 8px; + font-weight: bold; + color: #999999; +} + +div.panelDescription { + max-width: 450px; + padding: 10px; + font-size: 10pt; + color: #999999; +} + +div.panelDescription h3 { + font-size: 12pt; + color: #666666; + padding-top: 20px; + padding-bottom: 4px; +} + +div.panelDescription h5 { + padding-left: 0px; + border-bottom: 0px; +} + +div.panelDescription h5 a { + color: #333366; + text-decoration: none; +} + +div.panelDescription h5 a:hover { + text-decoration: underline; +} + +div.panelDescription ol { + padding-left: 25px; + list-style-position: outside; + list-style-type: decimal; + color: #ff9400; +} + +div.panelDescription ol li { + padding-bottom: 4px; +} + +div.panelDescription ol li p { + display: inline; + color: #999999; +} + + +div.panelDescription p { + padding-bottom: 10px; +} + +div.panelDescription p a { + color: #333366; + text-decoration: none; +} + +div.panelDescription p a:hover { + text-decoration: underline; +} + +/* @group SubSubTabs */ +ul.subSubMenu { + padding-left: 10px; + padding-bottom: 3px; +} + +ul.subSubMenu li { + font-size: 10pt; + color: #666666; + display: inline; + padding: 3px 10px; + cursor: pointer; +} + +ul.subSubMenu li.selectedTab { + color: white; + background-color: #333366; + cursor: default; +} + + + +/* @end */ + +/* @end */ + +/* @group Footer */ + +div#footer { + margin-top: 20px; + border-top: 1px solid #999999; + padding: 5px; + color: #666666; + text-align: center; + font-size: 8pt; +} + +div#footer a { + color: #333366; +} + +div#rss { + display: inline; + float: right; +} + +div#rss a { + vertical-align: middle; +} + +/* @end */ + +/* @group Main */ + +div#main h3.loading { + padding: 20px; + color: #666666; +} + +div#javaScriptAlert { + margin: 20px; + border: 4px solid #ff9403; + padding: 15px; +/* width: 70%; */ + max-width: 400px; + color: #999999; + font-size: 12pt; +} + +div#javaScriptAlert h1 { + color: #ff9403; + font-size: 28pt; + padding-bottom: 10px; +} + +div#javaScriptAlert h3 { + color: #333366; + padding-top: 10px; + padding-bottom: 10px; + font-size: 16pt; +} + +div#javaScriptAlert h5 { + color: #666666; + font-size: 12pt; +} + +input:focus { + background-color: #ffeac0; +} + +textarea:focus { + background-color: #ffeac0; +} + +/* @end */ + +/* @group Lock */ + +div#lockMessage { + color: #666666; + font-size: 10pt; +} + +div#lockMessage p { + padding-bottom: 15px; +} + +div#lockMessage form input { + width: 100%; +} +/* @end */ + +/* @group Password entropy display */ + +div.passwordEntropy { + margin-top: 0px; + margin-bottom: 4px; + height: 3px; + font-size: 1pt; +/* background: url(../images/entropyBackground.gif) repeat-x 0 0; */ + line-height: 3px; +} + +/* @end */ + + +div#miscLinks ul li a.highlightedHeader { +/* + color: white; + font-size: 12pt; + font-weight: bold; +*/ +} + +/* @group Donate */ + +a#donateHeaderLink.highlightedHeader { + font-weight: bold; +} + +img#donateHeaderIcon { + padding-top: 5px; + margin-bottom: -5px; +} + +div#miscLinks ul { + display: inline; +} + +/* @group Donate Splash */ + +div#donateMessage { + margin-left: 5px; +} + +div#donateMessage div.donateSplashPanelIcon { + float: left; + text-align: center; + width: 100px; + height: 70px; +} + +div#donateMessage div.donateSplashPanelDescription { + font-size: 11pt; + + color: #666666; + line-height: 23px; +} + +div#donateMessage div.donateSplashPanelDescription ul { + color: #aaaaaa; + padding-left: 5; + margin-bottom: 5px; + list-style-type: disc; + list-style-position: inside; +} + +div#donateMessage div.donateSplashPanelDescription ul li p { + display: inline; + color: #666666; +} + +div#donateMessage div.donateSplashPanelDescription a { + text-decoration: none; + color: #333366; +} + +div#donateMessage div a:hover { + text-decoration: underline; +} + +div#donateSplash div.ydlg-dlg-body div.ydlg-ft { + padding-right: 130px; +} + +/* @end */ + + +/* @end */ + +/* @group Password Generator */ + +div.Clipperz_PasswordGenerator_button { +/* background: url(../images/passwordAssistant.png) 0 22px; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAuCAMAAADuvZJ5AAACZFBMVEX///8APHTHyc4zM2bAwsn+/v/6+vrW2N/z9fjw8vX5/P329/ra3OH92InllwD4sjDd3+T+/v7/8M/3+Pnd3uL80nklV4P3+vwWTX7r7fLj5+v19vng4ujo6u9cXYW7vcuVlq56laiPkKtcXISpqr+EhaP09fnNz9fy9Pd9mar8ymnP0dmNjqmBgqHZ2+FniKDf4en6wVD8znFVfaJFRnR7lan5ukH+3ZX6xFnO0Nnn6e/09PCAgaH7x2H29vNtbpJXWIHw8/Z1dpfz9PjU1uCNnqHf4eiwscX29vTl5+319fF/f5/a3OLy8u5qi6Jmh6D2+fuHiKVsjKT09fji5Ov9/fzX2uLx8ew4OGr3+vv4tTXd3+WtrsP09O9gYIjy8u380nq/wdBmZoxWVoD7ymrz8+5VVoBYWYI7O2y+wM3u3K16fJw5OWo9PW6Ula+oqb/Z2+Dq7PFVVYC8vs4+Pm79249sbpGvsMTw8OtKcZP8znLttUf4szDr6OL6ukH6wFD+35rq6OH29vLs6+bv6NK/x8rs6+T5vUnt6ub5vUjs6+Xg3dTr6OH91YL+/v394Jv7yGCjrrRIbpDo5d+xt7bz8e7Az93x8Or47dPm493V3+i/ztvp5uDq5+Dm49y2vb3l4tvv7ujb1836+vn91YH4+PeEhnH4tDXk4tnk4tr5tzv7z3L6xFjt7OX4+Pb7+/rx8Ov5uDvvtUnw7urw7+n80Xro5d7n5N3u7eb6wFH6vkn5tzr4tzv6vUn19PL29PL19fK/ztzu7ef6w1jw8Orr6uPr6+X5ukLi39aDhG/5tDX6x2HHdGeUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAeRJREFUOMtjYGPADdgYFMUYMYGEPkhO0bVFCBPMcDUFyollifJiAtEsMaAcY4MoKyYQ7WcEyZmLckGAeCSXuHiAoziILWoOlisV5YYAaTVp52BubjVpIFu0FCzHK8oBAxocHJ5WYJYoL1iuV5QTDly8ixwC3YAM0SVguYQEScnC4vzyGBV3lWRmIJAzkJQU3QqWMzKSlVXNYYYBE5uSvBDZ1VVgOa0UKak0uBSzvVR2WZhUihZYznaCjEyik5Kuqk5cBFAuNylDKVrmtC1Y7rCFABT4ZKaD7bMUEFhjAZarN+SBAj0edQVlZQVtngKenYZgufZd7EhAXh5M7e0Ey9UdZ8EEZmZguY2rmDDBnt1AOQbGU1EimCBqOUhOYhM/FlBTLQGU81/Ghw2c9AOlGE2s6SWIAT8gPw0aT8OiZZYxOA0eFMQC+maD02BoKJY0uH4/OMzYFmNJg/s2g+WWrsOSBqd2gOU8PLCkwQ21YDk7OyxpcHoPWK7pAJY0uGUuWM7LC0saXDgHLGdtjSUNHpoMlouNxZIGd2wDy6WmYkmDa7eD5Xx9saTBrplgufh4LGmwbR5YLjwcSxo8ugAsV3EESxpsXAFOg83HsMit7AanwdYTWOQWzQenwcqJwphgyiTy0yAAb2mGoAo92xQAAAAASUVORK5CYIIK) 0 22px; + width: 27px; + height: 22px; +} + +div.Clipperz_PasswordGenerator_button.hover { +/* background: url(../images/passwordAssistant.png) 0 -1px; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAuCAMAAADuvZJ5AAACZFBMVEX///8APHTHyc4zM2bAwsn+/v/6+vrW2N/z9fjw8vX5/P329/ra3OH92InllwD4sjDd3+T+/v7/8M/3+Pnd3uL80nklV4P3+vwWTX7r7fLj5+v19vng4ujo6u9cXYW7vcuVlq56laiPkKtcXISpqr+EhaP09fnNz9fy9Pd9mar8ymnP0dmNjqmBgqHZ2+FniKDf4en6wVD8znFVfaJFRnR7lan5ukH+3ZX6xFnO0Nnn6e/09PCAgaH7x2H29vNtbpJXWIHw8/Z1dpfz9PjU1uCNnqHf4eiwscX29vTl5+319fF/f5/a3OLy8u5qi6Jmh6D2+fuHiKVsjKT09fji5Ov9/fzX2uLx8ew4OGr3+vv4tTXd3+WtrsP09O9gYIjy8u380nq/wdBmZoxWVoD7ymrz8+5VVoBYWYI7O2y+wM3u3K16fJw5OWo9PW6Ula+oqb/Z2+Dq7PFVVYC8vs4+Pm79249sbpGvsMTw8OtKcZP8znLttUf4szDr6OL6ukH6wFD+35rq6OH29vLs6+bv6NK/x8rs6+T5vUnt6ub5vUjs6+Xg3dTr6OH91YL+/v394Jv7yGCjrrRIbpDo5d+xt7bz8e7Az93x8Or47dPm493V3+i/ztvp5uDq5+Dm49y2vb3l4tvv7ujb1836+vn91YH4+PeEhnH4tDXk4tnk4tr5tzv7z3L6xFjt7OX4+Pb7+/rx8Ov5uDvvtUnw7urw7+n80Xro5d7n5N3u7eb6wFH6vkn5tzr4tzv6vUn19PL29PL19fK/ztzu7ef6w1jw8Orr6uPr6+X5ukLi39aDhG/5tDX6x2HHdGeUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAeRJREFUOMtjYGPADdgYFMUYMYGEPkhO0bVFCBPMcDUFyollifJiAtEsMaAcY4MoKyYQ7WcEyZmLckGAeCSXuHiAoziILWoOlisV5YYAaTVp52BubjVpIFu0FCzHK8oBAxocHJ5WYJYoL1iuV5QTDly8ixwC3YAM0SVguYQEScnC4vzyGBV3lWRmIJAzkJQU3QqWMzKSlVXNYYYBE5uSvBDZ1VVgOa0UKak0uBSzvVR2WZhUihZYznaCjEyik5Kuqk5cBFAuNylDKVrmtC1Y7rCFABT4ZKaD7bMUEFhjAZarN+SBAj0edQVlZQVtngKenYZgufZd7EhAXh5M7e0Ey9UdZ8EEZmZguY2rmDDBnt1AOQbGU1EimCBqOUhOYhM/FlBTLQGU81/Ghw2c9AOlGE2s6SWIAT8gPw0aT8OiZZYxOA0eFMQC+maD02BoKJY0uH4/OMzYFmNJg/s2g+WWrsOSBqd2gOU8PLCkwQ21YDk7OyxpcHoPWK7pAJY0uGUuWM7LC0saXDgHLGdtjSUNHpoMlouNxZIGd2wDy6WmYkmDa7eD5Xx9saTBrplgufh4LGmwbR5YLjwcSxo8ugAsV3EESxpsXAFOg83HsMit7AanwdYTWOQWzQenwcqJwphgyiTy0yAAb2mGoAo92xQAAAAASUVORK5CYIIK) 0 -1px; +} + +table tbody tr td span.passwordGeneratorLength { + padding: 0px; + margin: 0px; +} + +table tbody tr td span.passwordGeneratorLength span { + padding: 0px; + margin: 0px; + color: #bbbbbb; + font-size: 9pt; +} + +span.passwordGeneratorLength span.passwordGeneratorLengthValue { + padding-left: 3px; + font-weight: bold; +} + +div#passwordGenerator div.ydlg-bd { + overflow: hidden; +} + +form.passwordGenerator input.clipperz_passwordGenerator_password { + width: 95%; +} + +form.passwordGenerator table { + width: 95%; +} + +form.passwordGenerator table > tbody > tr > td { + white-space: nowrap; +} + +form.passwordGenerator td span { + padding-left: 3px; + padding-right: 10px; + font-size: 9pt; + color: #666666; +} + +/* @end */ + +/* @group IE Read-only header */ + +div#logoFrame a { + text-decoration: none; +} + +div#logoFrame a span { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: bold; + font-size: 24pt; + padding-top: 10px; + padding-left: 10px; +} +span.clipperzLogoSpan { + color: white; +} + +div#logoFrame a span span.clipperzLogoZSpan { + padding-left: 0px; + color: #ff9400; +} + + +/* @end */ + +span.activeText { + cursor: pointer; +} + +/* @group LoginInfo */ + +/* @group login panel */ + +div#loginInfoWrapper { + margin-left: 10px; +} + +div#loginInfo { + padding: 0px; + margin: 0px; + border: 0px; + width: 389px; + background: url(../images/loginInfoBackground.png) repeat-y -405px 0; +} + +div#loginInfo div.header { + background: url(../images/loginInfoBackground.png) no-repeat 0 0; + min-height: 20px; + height: 20px; +} + +div#loginInfo div.footer { + background: url(../images/loginInfoBackground.png) 389px -5px; + min-height: 20px; + height: 20px; +} + +div#loginInfo div.content { + padding-left: 20px; + padding-right: 25px; +} + +div#loginInfo div.content div { +} + +div#loginInfo div.content h4 { + font-weight: normal; + color: #666666; + font-size: 18pt; + padding-bottom: 10px; + padding-left: 10px; +} + + +/* @group Now + */ + +div#loginInfo div.loginInfo_now { + padding-left: 10px; + padding-right: 0px; +} + +div#loginInfo div.loginInfo_now div.text { + width: 200px; + color: #666666; + line-height: 20px; + float: left; + padding-bottom: 15px; +} + +div#loginInfo div.loginInfo_now div.icons { + text-align: right; + float: right; + width: 110px; +} + +div#loginInfo div.loginInfo_now div.icons img { + margin-left: 4px; +} + +div#loginInfo div.loginInfo_latest div.icons { + text-align: right; + float: right; + width: 110px; +} + +div#loginInfo div.loginInfo_latest div.icons img { + margin-left: 4px; +} + + + +/* @end */ + +/* @group Latest */ +div#loginInfo div.content div.loginInfo_latest { + background: url(../images/loginInfoInnerBackground.png) repeat-y -349px 0px; + width: 349px; + min-width: 349px; + clear: both; +} + +div#loginInfo div.loginInfo_latest div.inner_header { + background: url(../images/loginInfoInnerBackground.png) 0px 0px; + min-height: 6px; + height: 6px; + max-height: 6px; + font-size: 1px; +} + +div#loginInfo div.loginInfo_latest div.content { + padding-left: 12px; + padding-right: 5px; +} + +div#loginInfo div.loginInfo_latest div.text { + float: left; + width: 200px; + line-height: 20px; + color: #666666; + padding-bottom: 5px; +} + +div#loginInfo div.loginInfo_latest div.inner_footer { + + background: url(../images/loginInfoInnerBackground.png) 349px -9px; + min-height: 6px; + height: 6px; + max-height: 6px; + font-size: 1px; + clear: both; +} + +a#fullLoginHistoryLink { + font-size: 9pt; + color: #666666; + text-align: center; + padding: 5px 10px; + clear: both; + display: block; + text-decoration: none; + border-top: 1px dotted white; +} + +/* @end */ + +/* @group Download offline-copy warning */ + +table#shouldDownloadOfflineCopyWarningBox { + clear: both; + margin-top: 10px; +} + +div#loginInfo table tbody tr td.offlineCopyDownloadWarningIconTD img { +} + +a#offlineCopyDownloadWarningLink { + font-weight: bold; + color: #666666; + text-decoration: none; +} + +div#loginInfo div.content div.offlineCopyDownloadWarning h4 { + padding: 5px 10px 2px; + font-size: 11pt; +} + +div#loginInfo div.content div.offlineCopyDownloadWarning p { + color: #999999; + padding: 0px 10px 10px; +} + +/* @end */ + + + +/* @end */ + +/* @group history */ + + +table#loginHistoryTable { + padding-left: 2px; + padding-bottom: 15px; + padding-right: 50px; + font-size: 9pt; + color: #666666; +} + + +table#loginHistoryTable tr.zebra_even { + background-color: #f2f2f2; +} + +table#loginHistoryTable td.loginHistoryValues { + padding: 5px 10px; +} + +table#loginHistoryTable td.loginHistoryValues div.currentSession { + color: green; + font-size: 11pt; +} + +table#loginHistoryTable td.loginHistoryValues div.elapsedTime { + font-size: 11pt; +} + +table#loginHistoryTable td.loginHistoryValues div.fullDate { + font-size: 9pt; + color: #999999; +} + +table#loginHistoryTable td.loginHistoryValues div.loginHistoryIP { + padding-top: 3px; +} + +table#loginHistoryTable td.loginHistoryValues div.loginHistoryIP span.loginHistoryIPLabel { + padding-right: 5px; +} + +table#loginHistoryTable img { + display: block; + margin: 5px; +} + + +td.loginHistoryCountry, td.loginHistoryBrowser, td.loginHistoryOperatingSystem { + padding-left: 10px; + padding-right: 10px; + padding-bottom: 5px; +} + + +/* @end */ + +/* @end */ + +/* @group OTP */ + +div#oneTimePasswordList { + width: 700px; +} + +div#oneTimePasswords_header { + background-color: #ddddff; + padding: 5px; +} + +div#oneTimePasswords_header div ul { + padding-top: 3px; +} + +div#oneTimePasswords_header div ul li { + font-size: 9pt; + padding: 0px 5px; + display: inline; +} + +div#oneTimePasswords_header div ul li span { + color: #999999; +} + +div#oneTimePasswords_header div ul li a { + color: #333366; + text-decoration: none; +} + +table.oneTimePassword { + width: 100%; + padding: 0px 0px ; +} + +table.oneTimePassword tbody tr td { + border-bottom: 2px solid white; +} + +table.oneTimePassword tbody tr.oneTimePassword_used { + background-color: #f0f0f0; +} + +table.oneTimePassword tbody tr td input.otpCheckbox { + margin: 5px 10px 5px 10px; +} + +table.oneTimePassword tbody tr.oneTimePassword_used td span.oneTimePassword_value { + color: #aaaaaa; +} + +span.oneTimePassword_value { + color: #555555; + line-height: 22px; + font-size: 11pt; + font-family: monospace; + white-space: nowrap; +} + +span.disabledOneTimePassword { + font-size: 10pt; + display: block; + color: #999999; + font-style: italic; + padding-top: 5px; + font-weight: bold; +} + +div.oneTimePassword_usageStats { + padding-left: 20px; + padding-bottom: 5px; +} + +div.oneTimePassword_usageStats div.oneTimePassword_usageDateDescription { + line-height: 22px; + font-size: 10pt; + color: #999999; + font-weight: bold; +} + +div.oneTimePassword_usageStats div.oneTimePassword_usageDate { + color: #aaaaaa; + font-size: 9pt; +} + +div.oneTimePassword_usageStats div.oneTimePassword_usageDetails img { + padding: 5px; +} + +div.oneTimePassword_usageStats div.oneTimePassword_IP { + font-size: 9pt; + color: #999999; +} + +div.oneTimePassword_usageStats div.oneTimePassword_IP span.oneTimePassword_IPLabel { + padding-right: 4px; +} + +div.oneTimePassword_noPasswordPresent { + color: #999999; + padding: 10px; +} + + + +/* @group Calendar + */ + +div.calendarWidget { + text-align: right; +} + +table.calendarWidget { + font-size: 8pt; + color: #666666; +} + +table.calendarWidget td.daysOfWeek { + padding: 0px 3px; + color: white; + background-color: #ff9400; +} + +table.calendarWidget td.day { + text-align: right; +} + +table.calendarWidget td.day span { + padding: 0px 3px; +} + +table.calendarWidget td.day span.saturday { + font-weight: bold; +} + +table.calendarWidget td.day span.sunday { + font-weight: bold; + color: #ff9400; +} + +table.calendarWidget td.day span.today { + border: 1px solid #666666; + font-weight: bold; +} + +/* @end */ + + + +/* @end */ + +/* + +div.loadingMessage { + +} + +*/ + +/* @group Loading panel */ + +div.loadingMessage { + padding: 10px; + color: #666666; +} + +div.loadingMessage h6 { + font-size: 12pt; +} + +div.loadingMessage p { + font-size: 10pt; + padding: 5px 0px; +} + + +/* @end */ + +/* @group Import */ + +/* @group Formats */ + +/* +div.importFormats ul li { + width: 400px; + max-width: 400px; + min-width: 400px; + padding: 10px; + border: 1px solid white; +} + +div.importFormats ul li:hover { + border: 1px solid #ff9400; +} + +div.importFormats ul li.disabled:hover { + border: 1px solid white; +} + +div.importFormats ul li h4 { + font-size: 10pt; +} + +div.importFormats ul li:hover h4 { + font-size: 10pt; +} + +div.importFormats ul li.disabled h4 { + color: #888888; +} + +div.importFormats ul li p { + font-size: 9pt; + color: #999999; + padding: 5px 0px 5px 10px; +} +*/ +div.importFormats { + border-top: 3px double #ff9400; + padding-top: 10px; + border-bottom: 3px double #ff9400; + padding-bottom: 10px; + +} + +div.importFormats a { + color: #333366; + text-decoration: none; +} + +div.importFormats a:hover { + text-decoration: underline; +} + +ul.radioList { + padding: 5px; + list-style-type: none; + list-style-position: outside; +} + +ul.radioList li h4 { + font-size: 11pt; + font-weight: bold; + color: #ff9400; + text-decoration: none; + padding-bottom: 2px; + cursor: pointer; +} + +ul.radioList li.disabled h4 { + color: #666666; + cursor: auto; +} + +ul.radioList li table tr td { + font-size: 9pt; + color: #999999; + padding-left: 5px; + padding-bottom: 10px; +} + +div.templateDescription { + max-width: 420px; + padding: 2px 0px 5px; + font-size: 10pt; + color: #999999; +} + + +/* +div.importFormats ul { + padding: 5px; + list-style-type: none; + list-style-position: outside; +} + +div.importFormats ul li h4 { + font-size: 11pt; + font-weight: bold; + color: #ff9400; + text-decoration: none; + padding-bottom: 2px; + cursor: pointer; +} + +div.importFormats ul li.disabled h4 { + color: #666666; + cursor: auto; +} + +div.importFormats ul li table tr td { + font-size: 9pt; + color: #999999; + padding-left: 5px; + padding-bottom: 10px; +} + +*/ + + + + + + +.clickableElement { + cursor: pointer; +} + + + + +/* @end */ + + +div.wizardComponent h3 { + color: #666666; + padding: 10px; + margin-bottom: 10px; + border-bottom: 1px dotted #ff9400; +} + +/* @group Steps */ + +/* @group bar */ + +div.importWizardStepsBox { + height: 53px; + min-height: 53px; + max-height: 53px; + + padding-left: 18px; + margin-left: -10px; + + width:600px; + + background: url(../images/importStepsBackground.png) no-repeat; +} + +div.importWizardStepsInnerBox { + float: left; + + height: 53px; + min-height: 53px; + max-height: 53px; + + background: url(../images/importStepsBackground.png) repeat-x 0 -53px; +} + +div.importWizardStepsBoxFooter { + float: left; + + height: 53px; + min-height: 53px; + max-height: 53px; + + width: 18px; + min-width: 18px; + max-width: 18px; + + background: url(../images/importStepsBackground.png) no-repeat -9px -106px; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td { + padding-top: 9px; +} +div.importWizardStepsBox table.importWizardSteps tbody tr td div { + height: 23px; + min-height: 23px; + max-height: 23px; + + padding: 0px; + padding-left: 4px; + margin: 0px; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td div span { + color: #333366; + font-size: 9pt; + + height: 23px; + min-height: 23px; + max-height: 23px; + + display: block; + padding-right: 4px; + line-height: 22px; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td.current div { + padding-left: 8px; + background: url(../images/importStepsLabelsBackground.png) repeat-x 0 0px; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td.current div span { + color: white; + padding-right: 8px; + background: url(../images/importStepsLabelsBackground.png) repeat-x right -23px; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td.currentProcessing div { + padding-left: 8px; + background: url(../images/importStepsLeftLabelsBackground.png) repeat-x 0 0px; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td.currentProcessing div span { + padding-right: 8px; + background: url(../images/importStepsLeftLabelsBackground.png) repeat-x right -23px; +} + +/* @group Steps separator */ +div.importWizardStepsBox table.importWizardSteps tbody tr td.stepSeparator div { + width: 18px; + max-width: 18px; + min-width: 18px; + + background: url(../images/importStepsSeparator.png) no-repeat 0 2px; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td.stepSeparator div span { + display: none; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td.stepSeparatorProcessing div { + width: 18px; + max-width: 18px; + min-width: 18px; + + background: url(../images/importActiveStepsSeparator.png) no-repeat 0 2px; +} + +div.importWizardStepsBox table.importWizardSteps tbody tr td.stepSeparatorProcessing div span { + display: none; +} + + +/* @end */ + +/* +importStepsSeparator.png +importActiveStepsSeparator.png +*/ + +/* @end */ + + +div.importStepParameters { + padding-bottom: 10px; +} +/* @group CSV steps */ + +div.importStepBlocks div.step_2 div.importStepParameters span { + padding-left: 5px; + font-size: 9pt; + color: #999999; + +} + +div.importStepBlocks div.step_4 div.importStepParameters span { + padding-left: 5px; + font-size: 9pt; + color: #999999; + +} + + + +/* @end */ + + +/* @end */ + +div.importPreviewDiv { + height: 250px; + max-height: 250px; + overflow: auto; + + border: 1px solid #333366; + margin-bottom: 10px; +} + +textarea.importTextArea { + width: 500px; + height: 200px; +} + +body.masked div.importPreviewDiv { + overflow: hidden; +} + +div.importPreviewCommandsDiv { + width: 500px; +} + +div.importOptions { + color: #666666; + font-size: 10pt; + padding: 3px; +} + +div.importOptions span { + padding-left: 4px; +} + +/* @group Options */ + +div.importOptionsDescription { + padding: 10px 0px; + font-size: 10pt; + color: #666666; +} + +div.importStepDescription { + padding: 10px 0px; + font-size: 10pt; + color: #666666; +} + +div.CSVImportOptionsParameters ul { + padding-bottom: 10px; +} + +div.CSVImportOptionsParameters ul li { + padding-right: 15px; + display: inline; +} + +div.CSVImportOptionsParameters ul li label { + padding-right: 5px; + font-size: 9pt; + color: #999999; + +} + +div.importOptionsButtons { + padding: 10px; +} + +/* @end */ + +/* @group PasswordPlus */ +/* @end */ + +/* @group KeePass */ + +table#KeePassSettings { + margin: 15px 0px; + border-top: 3px double #cccccc; + border-bottom: 3px double #cccccc; + padding: 10px 10px; +} + +table#KeePassSettings td { + padding: 2px 0px; +} + +table#KeePassSettings span.keePassFieldLabel { + font-size: 10pt; + color: #666666; + padding-left: 5px; +} + +table#KeePassSettings span.keePassFieldLabel.disabled { + color: #aaaaaa; +} + + + +/* @end */ + +/* @group CSV */ + +div.csvImportPreview { + width: 700px; + max-width: 700px; + min-width: 700px; + + height: 300px; + max-height: 300px; + min-height: 300px; + + overflow: auto; +} + +table.csvImportPreview { +/* + border: 1px solid #333366; + margin-bottom: 10px; +*/ +} + +table.csvImportPreview thead tr th { + font-size: 10pt; + color: white; + background-color: #666666; + padding: 5px; + border-right: 1px solid #dddddd; +} + +table.csvImportPreview thead tr th span { + padding-left: 5px; +} + +table.csvImportPreview.header thead tr th input { + font-size: 9pt; + margin: 3px 0px; +} + +table.csvImportPreview tr.CSV_previewData_header td { + padding: 3px; + color: white; + border-right: 1px solid #dddddd; + background-color: #666666; +/* + padding-bottom: 15px; + border-bottom: 1px solid #333366; + border-bottom: 5px solid white; +*/ +} + +/* @group Columns */ + +table.csvImportPreview.columns th { + padding: 10px; + border-right: 1px solid white; +} + +table.csvImportPreview.columns th.selectedColumn { + background-color: #666666; +} + +table.csvImportPreview.columns th.skippedColumn { + background-color: #bbbbbb; +} + +table.csvImportPreview.columns td.selectedColumn { +} + +table.csvImportPreview.columns td.skippedColumn { + color: #aaaaaa; +} + +/* @end */ + +/* @group titleColumn */ + +table.csvImportPreview tr th.titleColumn { + background-color: #333366; +} + +table.csvImportPreview tbody tr.zebra_even td.titleColumn { + background-color: #e0e0ff; +/* + background-color: #ffffcc; +*/ +} + +table.csvImportPreview tbody td.titleColumn { + background-color: #f0f0ff; +/* + background-color: #ffffee; +*/ +} + +/* @end */ + +/* @group title */ + +table.csvImportPreview tr th.title, table.csvImportPreview tr.CSV_previewData_header td.title { + padding-left: 10px; + background-color: #333366; +} + +table.csvImportPreview tbody tr.zebra_even td.title { +} + +table.csvImportPreview tbody td.title { + font-weight: bold; +} + +/* @end */ + +/* @group notesColumn */ + +table.csvImportPreview tr th.notesColumn { + background-color: #333366; +} + +table.csvImportPreview tbody tr.zebra_even td.notesColumn { + background-color: #e0e0ff; +} + +table.csvImportPreview tbody td.notesColumn { + background-color: #f0f0ff; +} + +/* @end */ + +/* @group notes */ + +table.csvImportPreview tr.CSV_previewData_header td.notes { + padding-left: 10px; + font-style: normal; + background-color: #333366; +} + +table.csvImportPreview tbody tr.zebra_even td.notes { +} + +table.csvImportPreview tbody td.notes { + font-style: italic; +} + +/* @end */ + +/* @group Fields */ +table.csvImportPreview tr.CSV_previewData_header td span { + padding-left: 5px; + display: block; +} + +table.csvImportPreview tr.CSV_previewData_header td.missingLabelWarning { + background-color: #eeeeee; + border: 2px double red; +} + +table.csvImportPreview tr.CSV_previewData_header td.missingLabelWarning span { + color: red; +} + +table.csvImportPreview tr.CSV_previewData_header td.configuredColumn { + font-style: normal; + background-color: #333366; +} + +table.csvImportPreview td.configuredColumn { +} + +table.csvImportPreview td.unconfiguredColumn { + color: bbbbbb; +} + +/* @end */ + +table.csvImportPreview tr.CSV_previewData_header td:last-child { + border-right: 0px; +} + +table.csvImportPreview thead td { + font-size: 9pt; + padding: 4px 4px 3px; +} + +table.csvImportPreview tbody td { + border-right: 1px solid #dddddd; + color: #666666; + font-size: 9pt; + padding: 4px 4px 3px; +} + + + +table.csvImportPreview tbody td:last-child { + border-right: 0px; +} + +table.csvImportPreview tbody tr.zebra_even { + background-color: #f2f2f2; +} + + + +/* @end */ + +/* @group Preview */ + +table#importPreview { + width: 400px; +/* + margin: 15px 0px; + border-top: 3px double #cccccc; + border-bottom: 3px double #cccccc; + padding: 10px 0px; +*/ +} + +table#importPreview input { + margin: 4px 4px 0px 10px; +} + +table#importPreview tr.zebra_even { + background-color: #f2f2f2; +} + +span.importPreview_title { + font-size: 11pt; + + font-weight: bold; + padding: 4px 4px; + color: #333366; +} + +span.importPreview_notes { + display: block; + width: 150px; + padding: 4px; + font-size: 8pt; + color: #999999; +} + +table.importPreview_record { + padding-bottom: 10px; + padding-top: 10px; +} + +table.importPreview_record tbody tr td.importPreview_fieds { + border-left: 1px solid #dddddd; +} + +table.importPreview_fields { +/* + border-left: 1px solid #dddddd; +*/ + padding-left: 5px; +} + +span.importPreview_fields_label { + font-size: 9pt; + color: #666666; + display: block; + width: 150px; +} + +span.importPreview_fields_value { + font-size: 9pt; + color: #333366; +} + + +/* @end */ + + + +/* @end */ + +span.clickableSpan { + cursor: pointer; +} + + + +/* +div.importStepBlocks { + height: 220px; + min-height: 220px; + max-height: 220px; + width: 600px; + min-width: 600px; + max-width: 600px; + overflow: auto; +} +*/ + +hr { + margin-top: 20px; + border: 0px; + border-top: 1px dotted #aaaaaa; +} diff --git a/frontend/beta/css/clipperz/compact.css b/frontend/beta/css/clipperz/compact.css new file mode 100644 index 0000000..7c9252a --- /dev/null +++ b/frontend/beta/css/clipperz/compact.css @@ -0,0 +1,162 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* @override https://www.example.com/css/compact.css */ + +body.compact div#mainDiv { +/* + width: 250px; + height: 95%; + border: 1px solid #333366; +*/ + padding: 0px; +} + +body.compact div#compactHeader { + background-color: #333366; +} + +body.compact div#compactHeader img { + padding: 2px 20px 2px 4px; + width: 60; +} + +body.compact div#compactHeader a { + color: white; + text-decoration: none; + font-size: 10pt; +/* position: absolute; */ + right: 10px; + top: 6px; +} + +body.compact div#compactHeader a:hover { + color: #ff9400; +} + +body.compact h4 { + color: #999999; + text-align: center; + padding: 20px; + font-weight: normal; + font-size: 12pt; + font-style: italic; +} + +body.compact div.loginPanel form { + padding: 10px; +} + +body.compact div.loginPanel dt { + color: #aaaaaa; + font-size: 10pt; +} + +body.compact div.loginPanel input { + width: 180px; +} + +body.compact ul#directLogins { + background-image: none; + padding: 4px 0px; +} + +body.compact ul#directLogins li { + width:auto; +} + +body.compact ul#directLogins li.hover { + width:auto; + padding-right: 0px; +} + +body.compact div.lockPanel { + color: #999999; + font-size: 10pt; + padding: 10px; +} + +div#compactMiscLinks ul { +/* text-align: center; */ + display: block; + padding-left: 22px; + background-color: #ff9400; +} + +div#compactMiscLinks ul li { + display: inline; + padding: 2px 5px; +} + +div#compactHeader div#compactMiscLinks ul li a { + font-size: 9pt; +} + +div#compactHeader div#compactMiscLinks ul li a:hover { + color: #333366; +} + +div#lockBlock { + position: absolute; + right: 10px; + top: 6px; +} + +div#lockBlock input { + width: auto; + padding-bottom: 2px; +} + +div#lockBlock span { + font-size: 9pt; + padding: 0px 5px 0px 4px; + color: #aaaaaa; +} + +div#lockBlock a#lock { + font-size: 9pt; +} + +/* @group Donate */ + +a#donateHeaderLink { + font-weight: bold; +} + +div#compactMiscLinks a#donateHeaderIconLink img#donateHeaderLinkIcon { + display: inline; + position: absolute; + top: 22px; + left: 1px; + width: 12px; + height: 12px; +} + + + +/* @end */ \ No newline at end of file diff --git a/frontend/beta/css/clipperz/ie.css b/frontend/beta/css/clipperz/ie.css new file mode 100644 index 0000000..02b09f2 --- /dev/null +++ b/frontend/beta/css/clipperz/ie.css @@ -0,0 +1,351 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + + + + + + diff --git a/frontend/beta/css/clipperz/ytheme-clipperz.css b/frontend/beta/css/clipperz/ytheme-clipperz.css new file mode 100644 index 0000000..71ca4d1 --- /dev/null +++ b/frontend/beta/css/clipperz/ytheme-clipperz.css @@ -0,0 +1,141 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* @override + http://localhost:8080/pm-restyle/css/ytheme-clipperz.css + http://proxy/css/ytheme-clipperz.css + http://proxy/pm-497/css/ytheme-clipperz.css + https://www.example.com/css/ytheme-clipperz.css +*/ + +/* @group new Message dialog */ + +#mb-dlg .ext-mb-progress { + height:18px; +/* background:transparent url(../images/default/basic-dialog/progress2.gif) repeat-x 1px 1px; */ + background:transparent url(data:image/gif;charset=utf-8;base64,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) repeat-x 1px 1px; +} + +.ydlg .ydlg-hd { +/* background: url(../images/clipperz/basic-dialog/hd-sprite.gif) repeat-x 0 -82px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAwB7AIABADMzZv///yH5BAEAAAEALAAAAAADAHsAAAITBGKpy+0Po5y0Houz3rz7D4ZUAQA7Cg==) repeat-x 0 -82px; + background-color:navy; + color:#ffffff; + font:bold 12px "sans serif", Helvetica, Arial, Geneva, sans-serif; + overflow:hidden; + padding:5px; +} +.ydlg .ydlg-hd-left { +/* background: url(../images/clipperz/basic-dialog/hd-sprite.gif) no-repeat 0 -41px; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAwB7AIABADMzZv///yH5BAEAAAEALAAAAAADAHsAAAITBGKpy+0Po5y0Houz3rz7D4ZUAQA7Cg==) no-repeat 0 -41px; + padding-left:3px; + margin:0px; +} +.ydlg .ydlg-hd-right { +/* background: url(../images/clipperz/basic-dialog/hd-sprite.gif) no-repeat right 0; */ + background: url(data:image/gif;charset=utf-8;base64,R0lGODlhAwB7AIABADMzZv///yH5BAEAAAEALAAAAAADAHsAAAITBGKpy+0Po5y0Houz3rz7D4ZUAQA7Cg==) no-repeat right 0; + padding-right:3px; +} +.ydlg .ydlg-dlg-body { +/* background:url(../images/clipperz/layout/gradient-bg.gif);*/ + background-color: white; + border:1px solid #333366; + border-top:0 none; + padding:10px; + overflow:hidden; +} + +/* +.ydlg .ydlg-dlg-body .ydlg-ft{ + padding-top: 7px; + border-top: 1px dotted #333366; +} +*/ + +.ydlg .ydlg-close { + position:absolute; + top:4px; + right:4px; + z-index:6; + height:15px; + width:15px; + margin:0; + padding:0; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + cursor:pointer; + visibility:inherit; +/* background-image:url(../images/clipperz/basic-dialog/close.gif); */ + background-image:url(data:image/gif;charset=utf-8;base64,R0lGODlhDwAPANUAADk1bpeVs5+dub27z+Df6LGvxo2KqzIyZdfW4jk0brq4zNbU4cTD1ImGqVZSg/f2+Y+MraKgu9/e6NjX4qyqwjIyZtrZ5Pn5+mZij0pGenx4n0A7c7Oxx8C/0XZzm/39/Tw3cLCvxX57obe1yrCuxX16oP///zMzZjYxbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAPAA8AAAZ9wJNQSAgJKIuh8oTAoJ5PB2M5AEGvKMEQYcVeFUInqmSBoDyTwDNzIEAtJlPnY7oAngMSFBLvF6AGAlcdfRIJUBoUUB50fWpPDQtQE3EScQ93KBwnDk8BFwUJAQ8jTxsVJwxQmSisEUOCXk8iSwoZWBuvSycHAwYaDRyoQ0EAOwo=); +} + +/* @end */ + +/* @group Message dialog */ + +div#mb-dlg div div div.ydlg-hd { + background-color: #35306b; +} + +div#mb-dlg div.ydlg-dlg-body { + border-color: #333366; +} + +div#mb-dlg div.ydlg-dlg-body span.ext-mb-text { + font-size: 10pt; + color: #999999; +} + +div.ydlg-btns-center table tbody tr td { + text-align: center; +} + +/* @end */ + +body .ybtn-left{ +/* background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 0; */ + background:url(data:image/gif;charset=utf-8;base64,R0lGODlhAwCTAIcAAAA8dBZNfiVXg0hukEpxk1V9okD/QGaHoGeIoGqLomyMpHqVqHuVqX2ZqoOEb4SGceWXAPiyMPizMPi0Nfi1Nfm0Nfi3O/m3Ovm3O/m4O+21R++1Sfm6Qfm6Qvq6Qfm9SPm9Sfq9Sfq+SfrAUPrAUfrBUPrDWPrEWPrEWfrHYfvHYfvIYPvKavzKafvPcvzOcfzOcvzRevzSefzSeo2eoaOutLG3tra9vb/Hyr/O27/O3P3Vgf3Vgv3Yif3bj/7dlf7fmu7crf3gm8DCycfJzsDP3dvXzdbY39Xf6Nrc4d3e4t3f5ODd1OLf1uTi2eTi2uXi2+bj3Obj3efk3ejl3ujl3+/o0vjt0//wz+Di6OPn6+nm4Orn4Oro4evo4evo4uvq4+vr5ezr5Ozr5ezr5u3q5u3s5e7t5u7t5+jq7+/u6Ovt8vDv6fDu6vDw6vDw6/Hw6vHw6/Hx7PPx7vLy7fLy7vPz7vT07/Dy9fT08PX18fX08vX18vb08vb28vb28/b29PP1+Pb3+vf4+fj49vj49/r6+fr6+vv7+vn8/f39/P7+/f7+/v7+/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAMAAAYALAAAAAADAJMAAAj/AA0sELCgQBEBOhgBUKQIwCFDAAoRAgAIEIA/fwD44QNAjx4AefIAuHMHgB07AOrUAUCHDgA5cgC8cQOATJgAOJocIFDDQAMBARAYQFKAwaIcAhD1AbCnDYA5ZQDE+QIAjhcAbLgAULMFAJoqAM5QAWBmCoAxUgCIiQIADBQAXZwAeMIEgJEbAWwMSBBAgQEAgB0JZkS4keFEiAUpDsQYj+M1kNNI1kI5i+UlmJNoPsJ5iGcioEOHHkQaMACBBGlYERBEBgAgrn+49uG6h2sermfMAPDiBYAWLACoWAHABAoAI0oAACECgIcOADJgAFCBQoANEQ48gOATqNArNBjIfwgiQIYQADJ+oPeBvgf6HehjAHABAwCLFgBSqABw4jgJ5SF8AAAHHABgwQUAUDABABJoEAAEDvDll2lYVNjDhYY1glgiignCWCCO4QHZGpKlQZkWlmWB2RKaJcHZEZ4NEZoSNEZgIwQ4mkahhRee6OOPQAYp5JAn2hgBjhCYFhAAOwo=) no-repeat 0 0; +} +body .ybtn-right{ +/* background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 -21px; */ + background:url(data:image/gif;charset=utf-8;base64,R0lGODlhAwCTAIcAAAA8dBZNfiVXg0hukEpxk1V9okD/QGaHoGeIoGqLomyMpHqVqHuVqX2ZqoOEb4SGceWXAPiyMPizMPi0Nfi1Nfm0Nfi3O/m3Ovm3O/m4O+21R++1Sfm6Qfm6Qvq6Qfm9SPm9Sfq9Sfq+SfrAUPrAUfrBUPrDWPrEWPrEWfrHYfvHYfvIYPvKavzKafvPcvzOcfzOcvzRevzSefzSeo2eoaOutLG3tra9vb/Hyr/O27/O3P3Vgf3Vgv3Yif3bj/7dlf7fmu7crf3gm8DCycfJzsDP3dvXzdbY39Xf6Nrc4d3e4t3f5ODd1OLf1uTi2eTi2uXi2+bj3Obj3efk3ejl3ujl3+/o0vjt0//wz+Di6OPn6+nm4Orn4Oro4evo4evo4uvq4+vr5ezr5Ozr5ezr5u3q5u3s5e7t5u7t5+jq7+/u6Ovt8vDv6fDu6vDw6vDw6/Hw6vHw6/Hx7PPx7vLy7fLy7vPz7vT07/Dy9fT08PX18fX08vX18vb08vb28vb28/b29PP1+Pb3+vf4+fj49vj49/r6+fr6+vv7+vn8/f39/P7+/f7+/v7+/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAMAAAYALAAAAAADAJMAAAj/AA0sELCgQBEBOhgBUKQIwCFDAAoRAgAIEIA/fwD44QNAjx4AefIAuHMHgB07AOrUAUCHDgA5cgC8cQOATJgAOJocIFDDQAMBARAYQFKAwaIcAhD1AbCnDYA5ZQDE+QIAjhcAbLgAULMFAJoqAM5QAWBmCoAxUgCIiQIADBQAXZwAeMIEgJEbAWwMSBBAgQEAgB0JZkS4keFEiAUpDsQYj+M1kNNI1kI5i+UlmJNoPsJ5iGcioEOHHkQaMACBBGlYERBEBgAgrn+49uG6h2sermfMAPDiBYAWLACoWAHABAoAI0oAACECgIcOADJgAFCBQoANEQ48gOATqNArNBjIfwgiQIYQADJ+oPeBvgf6HehjAHABAwCLFgBSqABw4jgJ5SF8AAAHHABgwQUAUDABABJoEAAEDvDll2lYVNjDhYY1glgiignCWCCO4QHZGpKlQZkWlmWB2RKaJcHZEZ4NEZoSNEZgIwQ4mkahhRee6OOPQAYp5JAn2hgBjhCYFhAAOwo=) no-repeat 0 -21px; +} +body .ybtn-center{ +/* background:url(../images/default/basic-dialog/btn-sprite.gif) repeat-x 0 -42px; */ + background:url(data:image/gif;charset=utf-8;base64,R0lGODlhAwCTAIcAAAA8dBZNfiVXg0hukEpxk1V9okD/QGaHoGeIoGqLomyMpHqVqHuVqX2ZqoOEb4SGceWXAPiyMPizMPi0Nfi1Nfm0Nfi3O/m3Ovm3O/m4O+21R++1Sfm6Qfm6Qvq6Qfm9SPm9Sfq9Sfq+SfrAUPrAUfrBUPrDWPrEWPrEWfrHYfvHYfvIYPvKavzKafvPcvzOcfzOcvzRevzSefzSeo2eoaOutLG3tra9vb/Hyr/O27/O3P3Vgf3Vgv3Yif3bj/7dlf7fmu7crf3gm8DCycfJzsDP3dvXzdbY39Xf6Nrc4d3e4t3f5ODd1OLf1uTi2eTi2uXi2+bj3Obj3efk3ejl3ujl3+/o0vjt0//wz+Di6OPn6+nm4Orn4Oro4evo4evo4uvq4+vr5ezr5Ozr5ezr5u3q5u3s5e7t5u7t5+jq7+/u6Ovt8vDv6fDu6vDw6vDw6/Hw6vHw6/Hx7PPx7vLy7fLy7vPz7vT07/Dy9fT08PX18fX08vX18vb08vb28vb28/b29PP1+Pb3+vf4+fj49vj49/r6+fr6+vv7+vn8/f39/P7+/f7+/v7+/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAMAAAYALAAAAAADAJMAAAj/AA0sELCgQBEBOhgBUKQIwCFDAAoRAgAIEIA/fwD44QNAjx4AefIAuHMHgB07AOrUAUCHDgA5cgC8cQOATJgAOJocIFDDQAMBARAYQFKAwaIcAhD1AbCnDYA5ZQDE+QIAjhcAbLgAULMFAJoqAM5QAWBmCoAxUgCIiQIADBQAXZwAeMIEgJEbAWwMSBBAgQEAgB0JZkS4keFEiAUpDsQYj+M1kNNI1kI5i+UlmJNoPsJ5iGcioEOHHkQaMACBBGlYERBEBgAgrn+49uG6h2sermfMAPDiBYAWLACoWAHABAoAI0oAACECgIcOADJgAFCBQoANEQ48gOATqNArNBjIfwgiQIYQADJ+oPeBvgf6HehjAHABAwCLFgBSqABw4jgJ5SF8AAAHHABgwQUAUDABABJoEAAEDvDll2lYVNjDhYY1glgiignCWCCO4QHZGpKlQZkWlmWB2RKaJcHZEZ4NEZoSNEZgIwQ4mkahhRee6OOPQAYp5JAn2hgBjhCYFhAAOwo=) repeat-x 0 -42px; +} + +.ext-el-mask { + zoom:100%; +} + + +body.masked textarea { + overflow: hidden; +} diff --git a/frontend/beta/css/yui-extensions/basic-dialog.css b/frontend/beta/css/yui-extensions/basic-dialog.css new file mode 100644 index 0000000..f1b6375 --- /dev/null +++ b/frontend/beta/css/yui-extensions/basic-dialog.css @@ -0,0 +1,250 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ydlg-proxy { + background-image: url(../images/default/gradient-bg.gif); + background-color:#c3daf9; + border:1px solid #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.ydlg-shadow{ + background:#aaaaaa; + position:absolute; + left:0;top:0; +} +.ydlg-focus{ + -moz-outline:0 none; + outline:0 none; + width:0; + height:0; + overflow:hidden; + position:absolute; + top:0; + left:0; +} +.ydlg-mask{ + z-index:10000; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); + background-color:#CCC; +} +body.masked{ +} +body.masked select { + visibility:hidden; +} +body.masked .ydlg select { + visibility:visible; +} +.ydlg{ + z-index:10001; + overflow:hidden; + position:absolute; + left:300;top:0; +} +.yresizable-proxy{ + z-index:10002; +} +.ydlg .ydlg-hd { + background: url(../images/default/basic-dialog/hd-sprite.gif) repeat-x 0 -82px; + background-color:navy; + color:#ffffff; + font:bold 12px "sans serif", tahoma, verdana, helvetica; + overflow:hidden; + padding:5px; +} +.ydlg .ydlg-hd-left { + background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat 0 -41px; + padding-left:3px; + margin:0px; +} +.ydlg .ydlg-hd-right { + background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat right 0; + padding-right:3px; +} +.ydlg .ydlg-dlg-body{ + background:url(../images/default/layout/gradient-bg.gif); + border:1px solid #6593cf; + border-top:0 none; + padding:10px; + overflow:hidden; +} +.ydlg .ydlg-bd{ + overflow:hidden; +} +.ydlg .ydlg-ft{ + overflow:hidden; + padding:5px; + padding-bottom:0; +} +.ydlg .yui-ext-tabbody{ + background:white; + overflow:auto; +} +.ydlg .ytabs-top .yui-ext-tabbody{ + border:1px solid #6593cf; + border-top:0 none; +} +.ydlg .ytabs-bottom .yui-ext-tabbody{ + border:1px solid #6593cf; + border-bottom:0 none; +} +.ydlg .ylayout-container .yui-ext-tabbody{ + border:0 none; +} +.ydlg .inner-tab{ + margin:5px; +} +.ydlg .ydlg-ft .ybtn{ + margin-right:5px; + float:right; + clear:none; +} +.ydlg .ydlg-ft .ydlg-btns td { + border:0; + padding:0; +} +.ydlg .ydlg-ft .ydlg-btns-right table{ + float:right; + clear:none; +} +.ydlg .ydlg-ft .ydlg-btns-left table{ + float:left; + clear:none; +} +.ydlg .ydlg-ft .ydlg-btns-center{ + text-align:center; /*ie*/ +} +.ydlg .ydlg-ft .ydlg-btns-center table{ + margin:0 auto; /*everyone else*/ +} +.ydlg-draggable .ydlg-hd{ + cursor:move; +} +.ydlg-closable .ydlg-hd{ + padding-right:22px; +} +.ydlg .ydlg-close { + position:absolute; + top:4px; + right:4px; + z-index:6; + height:15px; + width:15px; + margin:0; + padding:0; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + cursor:pointer; + visibility:inherit; + background-image:url(../images/default/basic-dialog/close.gif); +} +.ydlg div.yresizable-handle-east{ + background-image:url(../images/default/sizer/e-handle-dark.gif); + border:0; + background-position:left; + margin-right:0; +} +.ydlg div.yresizable-handle-south{ + background-image:url(../images/default/sizer/s-handle-dark.gif); + border:0; + height:6px; +} +.ydlg div.yresizable-handle-west{ + background-image:url(../images/default/sizer/e-handle-dark.gif); + border:0; + background-position:1px; +} +.ydlg div.yresizable-handle-north{ + background-image:url(../images/default/s.gif); + border:0; +} +.ydlg div.yresizable-handle-northeast, .ytheme-gray .ydlg div.yresizable-handle-northeast{ + background-image:url(../images/default/s.gif); + border:0; +} +.ydlg div.yresizable-handle-northwest, .ytheme-gray .ydlg div.yresizable-handle-northwest{ + background-image:url(../images/default/s.gif); + border:0; +} +.ydlg div.yresizable-handle-southeast{ + background-image:url(../images/default/sizer/corners-sprite.gif); + background-position: top left; + width:8px; + height:8px; + border:0; +} +.ydlg div.yresizable-handle-southwest{ + background-image:url(../images/default/sizer/corners-sprite.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0; +} + +#mb-dlg .ydlg-ft .ybtn{ + float:none; + clear:none; + margin:0 3px; +} + +#mb-dlg .ydlg-bd { + padding:5px; + overflow:hidden !important; +} +#mb-dlg .ext-mb-input { + margin-top:4px; + width:95%; +} +#mb-dlg .ext-mb-textarea { + margin-top:4px; + font:normal 13px verdana,tahoma,sans-serif; +} +#mb-dlg .ext-mb-progress-wrap { + margin-top:4px; + border:1px solid #6593cf; +} +#mb-dlg .ext-mb-progress { + height:18px; + background:transparent url(../images/default/basic-dialog/progress2.gif) repeat-x 1px 1px; +} +#mb-dlg .ext-mb-progress-bar { + height:18px; + overflow:hidden; + width:0; + background:#8bb8f3; +} diff --git a/frontend/beta/css/yui-extensions/button.css b/frontend/beta/css/yui-extensions/button.css new file mode 100644 index 0000000..ee2d86f --- /dev/null +++ b/frontend/beta/css/yui-extensions/button.css @@ -0,0 +1,86 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ybtn{ + font:normal 11px arial, tahoma, verdana, helvetica; + cursor:pointer; + white-space: nowrap; +} +.ybtn-left, .ybtn-right{ + font-size:1px; + line-height:1px; +} +.ybtn-left{ + width:3px; + height:21px; + background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 0; +} +.ybtn-right{ + width:3px; + height:21px; + background:url(../images/default/basic-dialog/btn-sprite.gif) no-repeat 0 -21px; +} +.ybtn-focus{ + text-decoration:none !important; + color:black !important; + display: -moz-inline-block; + display:inline-block; + width:auto; + position:relative; + white-space: nowrap; +} +.ybtn-center{ + background:url(../images/default/basic-dialog/btn-sprite.gif) repeat-x 0 -42px; + font:normal 11px "san serif",tahoma,verdana,helvetica; + vertical-align: middle; + text-align:center; + padding:0 5px; + cursor:pointer; + white-space:nowrap; + -moz-user-select: none; + -khtml-user-select: none; +} +.ybtn-over .ybtn-left{ + background-position:0 -63px; +} +.ybtn-over .ybtn-right{ + background-position:0 -84px; +} +.ybtn-over .ybtn-center{ + background-position:0 -105px; +} +.ybtn-click .ybtn-center{ + background-position:0 -126px; +} +.ybtn-disabled{ + cursor:default; +} +.ybtn-disabled .ybtn-center{ + color:gray; + cursor:default; +} diff --git a/frontend/beta/css/yui-extensions/core.css b/frontend/beta/css/yui-extensions/core.css new file mode 100644 index 0000000..3cd8b6e --- /dev/null +++ b/frontend/beta/css/yui-extensions/core.css @@ -0,0 +1,53 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ext-el-mask { + z-index:20000; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); + background-color:#CCC; + width:100%; + height:100%; + zoom:1; +} +.ext-masked { + overflow:hidden !important; +} +.ext-masked select,.ext-masked object,.ext-masked embed{ + visibility:hidden; +} +.ylayer-shadow{ + background:#cccccc; + opacity:.3; + -moz-opacity:.3; + filter: alpha(opacity=30); +} \ No newline at end of file diff --git a/frontend/beta/css/yui-extensions/dd.css b/frontend/beta/css/yui-extensions/dd.css new file mode 100644 index 0000000..ac2ba40 --- /dev/null +++ b/frontend/beta/css/yui-extensions/dd.css @@ -0,0 +1,81 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ydd-drag-proxy{ + position:absolute; + left:0;top:0; + visibility:hidden; + z-index:15000; +} +.ydd-drag-ghost{ + color: black; + font: normal 11px arial, helvetica, sans-serif; + -moz-opacity: 0.85; + opacity:.85; + filter: alpha(opacity=85); + border-top:1px solid #dddddd; + border-left:1px solid #dddddd; + border-right:1px solid #bbbbbb; + border-bottom:1px solid #bbbbbb; + padding:3px; + padding-left:20px; + background-color:white; + white-space:nowrap; +} +.ydd-drag-repair .ydd-drag-ghost{ + -moz-opacity: 0.4; + opacity:.4; + filter: alpha(opacity=40); + border:0 none; + padding:0; + background-color:transparent; +} +.ydd-drag-repair .ydd-drop-icon{ + visibility:hidden; +} +.ydd-drop-icon{ + position:absolute; + top:3px; + left:3px; + display:block; + width:16px; + height:16px; + background-color:transparent; + background-position: center; + background-repeat: no-repeat; + z-index:1; +} +.ydd-drop-nodrop .ydd-drop-icon{ + background-image: url(../images/default/dd/drop-no.gif); +} +.ydd-drop-ok .ydd-drop-icon{ + background-image: url(../images/default/dd/drop-yes.gif); +} +.ydd-drop-ok-add .ydd-drop-icon{ + background-image: url(../images/default/dd/drop-add.gif); +} diff --git a/frontend/beta/css/yui-extensions/grid.css b/frontend/beta/css/yui-extensions/grid.css new file mode 100644 index 0000000..01be8d5 --- /dev/null +++ b/frontend/beta/css/yui-extensions/grid.css @@ -0,0 +1,584 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ygrid-cell-text { + display: block; + overflow: hidden; + padding: 3px 5px; + white-space: nowrap; +} +.ygrid-col{ + cursor: default; + height:21px !important; + box-sizing: border-box; + -moz-box-sizing: border-box; + position:absolute; + display:block; + -moz-outline: none; + -moz-user-focus: normal; + overflow: hidden; + border-left: 1px solid #f1efe2; +} +.yeditgrid .ygrid-col{ + -moz-outline: normal; +} +.ygrid-col, .ygrid-hd { + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.ygrid-col-0{ + border-left: 0; +} +.ygrid-col-last{ + border-right: 1px solid #f1efe2; +} +.ygrid-editor{ + box-sizing: border-box; + -moz-box-sizing: border-box; + position:absolute; + visibility:hidden; + font: normal 8pt arial; + border: 1px solid #afbdc9; + z-index:10; +} +.ygrid-editor input{ + font: normal 8pt arial; + border: 0; + padding-top:2px; + padding-left:3px; +} +.ygrid-editor-container{ + overflow:hidden; + display:block; + background-color:white; +} +.ygrid-editor .pick-button{ + width:15px; + height:20px; + position:absolute; + display:block; + right:0; + top:0; + z-index:2; + background-image: url(../images/default/grid/pick-button.gif); + background-repeat: no-repeat; +} +.ygrid-editor-invalid{ + background-image: url(../images/default/grid/invalid_line.gif); + background-repeat: repeat-x; + background-position: bottom; + border: 1px solid #afbdc9; +} +.ygrid-checkbox-editor{ + text-align: center; + overflow:hidden; + display:block; + background-color:white; +} +.ygrid-checkbox-editor input{ + margin-top:3px; + height:13px; + width:13px; +} +select.ygrid-editor{ + padding: 0; + -moz-outline: none; + border: 1px solid #afbdc9; +} +.ygrid-num-editor{ + text-align:right; + padding-top:2px; + padding-left:3px; +} +.ygrid-text-editor{ + padding-top:2px; + padding-left:3px; +} +.ygrid-hd{ + font: normal 8pt arial; + background-color: #ebeadb; + box-sizing: border-box; + -moz-box-sizing: border-box; + display: block; + position: absolute; + overflow:hidden; +} +.ygrid-column-sizer { + width:1px; + border-right:1px dashed #6593cf; + background:none; + cursor: col-resize; +} +.ygrid-drag-proxy{ + width:150px; + height:24px; + background-color:#3366cc; + border: 1px solid #002266; + position:absolute; + visibility:hidden; + z-index:10000; +} +.ygrid-drag-text{ + font: normal 8pt arial; + color:white; + position:absolute; + top:0; + left:26px; + padding:3px; + display:block; +} +.ygrid-drop-icon{ + position:absolute; + top:0; + left:0; + display:block; + width:24px; + height:100%; + background-position: center; + background-repeat: no-repeat; +} +.ygrid-drop-nodrop{ + background-image: url(../images/default/grid/drop-no.gif); +} +.ygrid-drop-ok{ + background-image: url(../images/default/grid/drop-yes.gif); +} +.ygrid-hd .sort-asc { + background-image: url(../images/default/grid/sort_asc.gif); + background-position: right; + background-repeat: no-repeat; + display: none; + height: 14px; + width: 16px; +} +.ygrid-hd .sort-desc { + background-image: url(../images/default/grid/sort_desc.gif); + background-position: right; + background-repeat: no-repeat; + display: none; + height: 14px; + width: 16px; +} +.ygrid-hd-body { + cursor: default; + display: block; + font: normal 8pt arial; + left: 0; + overflow: hidden; + padding: 3px 5px; + position: relative; + top: 0; + white-space: nowrap; +} +.ygrid-hd-body span { + font: normal 8pt arial; + white-space: nowrap; +} +.ygrid-hd-over{ + border-bottom: 2px solid #fcc247; +} +.ygrid-hd-over .ygrid-hd-body{ + background-color: #faf9f4; + border-bottom: 1px solid #f9a900; +} +.ygrid-hd-split { + background-image: url(../images/default/grid/grid-split.gif); + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} +.ygrid-hrow{ + background: #ebeadb url(../images/default/grid/grid-hrow.gif) repeat-x; + display: block; + height: 22px; + left: 0; + position: relative; + top: 0; + width: 10000px; + overflow:hidden; + z-index:2; +} +.ygrid-hrow-frame{ + height: 22px; + left: 0; + display:block; + position: absolute; + top: 0; + width: 10000px; + z-index:1; +} +.ygrid-footer .ytoolbar{ + border:0; +} +.ygrid-page-number{ + width:24px; + height:14px; +} +.ygrid-page-first{ + background-image: url(../images/default/grid/page-first.gif); +} +.ygrid-loading{ + background-image: url(../images/default/grid/done.gif); +} +.ygrid-page-last{ + background-image: url(../images/default/grid/page-last.gif); +} +.ygrid-page-next{ + background-image: url(../images/default/grid/page-next.gif); +} +.ygrid-page-prev{ + background-image: url(../images/default/grid/page-prev.gif); +} +.ytb-button-disabled .ygrid-loading{ + background-image: url(../images/default/grid/loading.gif); +} +.ytb-button-disabled .ygrid-page-first{ + background-image: url(../images/default/grid/page-first-disabled.gif); +} +.ytb-button-disabled .ygrid-page-last{ + background-image: url(../images/default/grid/page-last-disabled.gif); +} +.ytb-button-disabled .ygrid-page-next{ + background-image: url(../images/default/grid/page-next-disabled.gif); +} +.ytb-button-disabled .ygrid-page-prev{ + background-image: url(../images/default/grid/page-prev-disabled.gif); +} +.ygrid-mso{ +} +.ygrid-mso .ygrid-hd{ + background:none; + border-bottom:0; +} +.ygrid-mso .ygrid-footer { + border-top: 1px solid #6593cf; +} + +.ygrid-mso .ygrid-footer .ygrid-fbutton{ + border:0; +} +.ygrid-mso .ygrid-hd-body { + border-bottom:0; +} +.ygrid-mso .ygrid-hd-over{ + border-bottom:0; +} +.ygrid-mso .ygrid-hd-over .ygrid-hd-body{ + background-color: transparent; +} +.ygrid-mso .ygrid-hd-split { + background-image: url(../images/default/grid/grid-blue-split.gif); +} +.ygrid-mso .ytoolbar .ytb-sep { + background-image: url(../images/default/grid/grid-blue-split.gif); +} +.ygrid-mso .ygrid-hrow{ + background: url(../images/default/grid/mso-hd.gif); + border-bottom: 1px solid #6593cf; + height: 21px; +} +.ygrid-mso .ygrid-row{ + color: black; + border-bottom: 1px solid #ddecfe; +} +.ygrid-mso .ygrid-row-alt{ + background-color: #f5f5f5; +} +.ygrid-mso .ygrid-row-selected{ + background-color: #b3c8e8 !important; + color: black; +} +.ygrid-mso .ygrid-row-selected span{ + color: black !important; +} +.yprops-grid .ygrid-col-1{ + background-color: #f1efe2; +} +.yprops-grid .ygrid-col-1 .ygrid-cell-text{ + background-color: white; +} +.yprops-grid .ygrid-col-0{ + background-color: #f1efe2; +} +.yprops-grid .ygrid-col-0 .ygrid-cell-text{ + background-color: white; + margin-left:10px; +} +.yprops-grid .ygrid-prop-edting .ygrid-col-0 .ygrid-cell-text{ + background-color: #316ac5; + color: white; +} +.yprops-grid .ygrid-prop-edting .ygrid-col-0{ + color: white; +} +.yprops-grid .ygrid-num-editor{ + text-align:left; +} +.ygrid-row{ + font: normal 8pt arial; + border-bottom: 1px solid #f1efe2; + overflow: visible; + white-space: nowrap; + height:21px; + width:10000px; + box-sizing: border-box; + -moz-box-sizing: border-box; + display:block; + position:absolute; +} +.ygrid-row-alt{ + background-color: #fcfaf6; +} +.ygrid-row-over{ + background-color: #f1f1f1; + color: black; +} +.ygrid-row-selected{ + background-color: #316ac5 !important; + color: white; +} +.ygrid-row-selected span{ + color: white !important; +} +.ygrid-vista{ + border:1px solid #535353; +} +.ygrid-vista .ygrid-hd{ + border-bottom:0px; + background:none; +} +.ygrid-vista .ygrid-hd-body { + border-bottom: 1px solid #b3bcc0; +} +.ygrid-vista .ygrid-hd-over{ + border-bottom:0px; +} +.ygrid-vista .ygrid-hd-over .ygrid-hd-body{ + background-color: transparent; + border-bottom:0; +} +.ygrid-vista .ygrid-hd-split { + background-image: url(../images/default/grid/grid-split.gif); +} +.ygrid-vista .ygrid-hrow{ + background: url(../images/default/grid/grid-vista-hd.gif); + height: 21px; +} +.ygrid-vista .ygrid-row-alt{ + background-color: #f5f5f5; +} +.ygrid-vista .ygrid-row-selected{ + background-color: #535353 !important; + color: white; +} +.ygrid-vista .ygrid-row-selected span{ + color: white !important; +} +.ygrid-vista .ygrid-wrap-body { +} +.ygrid-vista .ytoolbar{ + border: 0px none; + background: url(../images/default/grid/grid-vista-hd.gif); +} +.ygrid-vista .ytoolbar .ytb-sep{ + background-image: url(../images/default/grid/grid-split.gif); +} +/* + To have the scrollbars overlap the header, change .ygrid-wrap top style to 0 and + and ygrid-wrap-body top to 22px + Then grid.getView().scrollbarMode = YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP; + */ +.ygrid-wrap { + height: 100%; + left: 0; + overflow: auto; + position: relative; + top: 22px; + width: 100%; +} +.ygrid-footer{ + display: block; + padding:0; + border-top: 1px solid #cbc7b8; +} +.ygrid-wrap-footer { + display: block; + overflow: hidden; + width:100%; + height:25px; + box-sizing: border-box; + -moz-box-sizing: border-box; + background-color: #ebeadb; + position:absolute; + bottom:0; +} +.ygrid-wrap-body { + left: 0; + overflow: hidden; + position: absolute; + top: 0; + display: block; +} +.ygrid-wrap-headers { + left: 0; + overflow: hidden; + position: absolute; + top: 0; + z-index: 12; +} +.ypopcal{ + background: white; + padding:2px; + border: 1px solid gray; + z-index:12001; + -moz-outline:none; + position:absolute; + display:none; + top:0; + left:0; +} +.ypopcal-shadow { + background: #dddddd; + filter: progid:DXImageTransform.Microsoft.Blur(MakeShadow=true,pixelradius=1) Alpha(opacity=35,style=1,startX=0,finishX=200,FinishOpacity=35); + padding: 0; + position:absolute; + z-index:12000; + display:none; + top:0; + left:0; +} +.ypopcal-head{ + width:150px; + background: #93b5e4; +} +.ypopcal-head td{ + padding:1px; +} +.ypopcal-month{ + color: white; + font: bold 7pt verdana; + text-decoration: none; + text-align:center; +} +.ypopcal-head .ypopcal-arrow{ + width:16px; + text-align:center; + cursor:pointer; + -moz-user-select: none; +} + +.ypopcal-head .next-month{ + width:16px; + background-image: url(../images/default/grid/arrow-right-white.gif); + background-position: center; + background-repeat: no-repeat; + cursor:pointer; +} +.ypopcal-head .prev-month{ + width:16px; + background-image: url(../images/default/grid/arrow-left-white.gif); + background-position: center; + background-repeat: no-repeat; + cursor:pointer; +} + +.ypopcal-table { + background:white; + border-bottom: 1px solid #cccccc; +} +.ypopcal-table tr{ + +} +.ypopcal-table td{ + box-sizing: border-box; + -moz-box-sizing: border-box; + border: 1px solid white; + text-align:right; + color:#aaaaaa; + cursor:pointer; + font:normal 8pt arial; + background:white; + padding:1px 2px; + width:12px; + height:12px; +} +.ypopcal-table td.today{ + border: 1px solid darkred; +} +.ypopcal-table .ypopcal-daynames td{ + text-align:center !important; + border:0; + border-bottom: 1px solid #cccccc; + font-size: 8pt; + font-weight: normal; + text-align:right; + color:black; + cursor:default; +} +.ypopcal-table td.active{ + cursor:pointer; + color:black; +} +.ypopcal-table td.ypopcal-disabled{ + cursor:default; + background:#eeeeee; + border: 1px solid #eeeeee; + color:#bbbbbb; +} +.ypopcal-table td.selected{ + background: #ddecfe; + border: 1px solid #c3daf9; +} +.ypopcal-today{ + color: black; + cursor: hand; + display: inline-block; + font: normal 8pt arial; + margin-left: 2px; + text-decoration: none; + margin-top:2px; +} + +.ygrid-simple-view .ygrid-col{ + height:100% !important; + position:static; + display:table-cell; + display:inline-block; +} +.ygrid-simple-view .ygrid-row{ + position:static; + display: table-row; +} diff --git a/frontend/beta/css/yui-extensions/inline-editor.css b/frontend/beta/css/yui-extensions/inline-editor.css new file mode 100644 index 0000000..1ef560a --- /dev/null +++ b/frontend/beta/css/yui-extensions/inline-editor.css @@ -0,0 +1,60 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.yinline-editor { + border: 1px solid #a3bac9; + font: normal 11px arial,helvetica,sans-serif; + left: 0; + overflow: hidden; + padding: 1px 0 0 1px; + position: absolute; + top: 0; +} +.yinline-editor-multiline { + overflow: hidden; + padding: 0; + white-space: nowrap; +} +.yinline-editor-sizer { + font: normal 11px arial,helvetica,sans-serif; + left: -1000px; + padding: 3px; + padding-right: 6px; + position: absolute; + top: -1000px; + visibility: hidden; + white-space: nowrap; +} +.yinline-editor-wrap { + color: white; + overflow: auto; + position: absolute; + top: 0; + visibility: hidden; + z-index: 15002; +} diff --git a/frontend/beta/css/yui-extensions/layout.css b/frontend/beta/css/yui-extensions/layout.css new file mode 100644 index 0000000..58456ac --- /dev/null +++ b/frontend/beta/css/yui-extensions/layout.css @@ -0,0 +1,228 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ylayout-container{ + width:100%; + height:100%; + overflow:hidden; + background-color:#c3daf9; +} +.ylayout-collapsed{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; + background-color:#c3daf9; + width:20px; + height:20px; + overflow:hidden; + border:1px solid #98c0f4; + z-index:20; +} +.ylayout-collapsed-over{ + cursor:pointer; + background-color:#d9e8fb; +} +.ylayout-collapsed-west .ylayout-tools-button{ + float:right; +} +.ylayout-collapsed-east .ylayout-tools-button{ + float:left; +} +.ylayout-collapsed-north, .ylayout-collapsed-south{ + text-align:right; +} +.ylayout-collapsed .ylayout-tools-button{ + margin:2px; + width:12px; + text-align:center; +} +.ylayout-inactive-content{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; +} +.ylayout-active-content{ + visibility:visible; +} +.ylayout-panel{ + position:absolute;border:1px solid #98c0f4;overflow:hidden;background-color:white; +} +.ylayout-panel-east, .ylayout-panel-west { + z-index:10; +} +.ylayout-panel-north, .ylayout-panel-south { + z-index:11; +} +.ylayout-collapsed-north, .ylayout-collapsed-south, .ylayout-collapsed-east, .ylayout-collapsed-west { + z-index:12; +} +.ylayout-panel-body{ + overflow:hidden; +} +.ylayout-grid-wrapper{ + +} +.ylayout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:#c3daf9; +} +.ylayout-panel-hd{ + background-image: url(../images/default/layout/panel-title-light-bg.gif); + color: black; + border-bottom:1px solid #98c0f4; + position:relative; +} +.ylayout-panel-hd-text{ + font:normal 11px tahoma, verdana, helvetica; + padding: 4px; + padding-left: 4px; + display:block; + white-space:nowrap; +} +.ylayout-panel-hd-tools{ + position:absolute; + right:0; + top:0; + text-align:right; + padding-top:2px; + padding-right:2px;width:40px; +} +.ylayout-tools-button{ + z-index:6; + padding:2px; + cursor:pointer; +} +.ylayout-tools-button-over{ + padding:1px; + border:1px solid #98c0f4; + background-color:white; +} +.ylayout-tools-button-inner{ + height:12px; + width:12px; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + background-position:center; +} +.ylayout-close{ + background-image:url(../images/default/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -48px; +} +.ylayout-collapse-west,.ylayout-expand-east{ + background-image:url(../images/default/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% 0; +} +.ylayout-expand-west,.ylayout-collapse-east{ + background-image:url(../images/default/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -12px; +} +.ylayout-collapse-north,.ylayout-expand-south{ + background-image:url(../images/default/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -24px; +} +.ylayout-expand-north,.ylayout-collapse-south{ + background-image:url(../images/default/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -36px; +} +.ylayout-split-h{ + background-image:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.ylayout-split-v{ + background-image:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.ylayout-panel .ytab-wrap{ + background:url(../images/default/layout/gradient-bg.gif); +} +.ylayout-panel .yui-ext-tabbody { + background-color:white; + overflow:auto;height:100%; +} +.ylayout-component-panel, .ylayout-nested-layout { + position:relative; + padding:0; + overflow:hidden; + width:200px; + height:200px; +} +.ylayout-nested-layout .ylayout-panel { + border:0 none; +} +.ylayout-nested-layout .ylayout-panel-north { + border-bottom:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-south { + border-top:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-east { + border-left:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-west { + border-right:1px solid #98c0f4; +} +.yui-ext-repaint{ + zoom:1; + background-color: transparent; +} +.ylayout-panel-dragover { + border: 2px solid #6593cf; +} +.ylayout-panel-proxy { + background-image: url(../images/default/layout/gradient-bg.gif); + background-color:#c3daf9; + border:1px dashed #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.ylayout-slider { + z-index:15; + overflow:hidden; + position:absolute; +} + +.yunselectable{ + -moz-user-select: none; + -khtml-user-select: none; + cursor:default; +} diff --git a/frontend/beta/css/yui-extensions/qtips.css b/frontend/beta/css/yui-extensions/qtips.css new file mode 100644 index 0000000..4165168 --- /dev/null +++ b/frontend/beta/css/yui-extensions/qtips.css @@ -0,0 +1,70 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ytip{ + position: absolute; + top: 0; + visibility: hidden; + z-index: 11000; +} +.ytip .ytip-bd{ + background: #e0e8f3 url(../images/default/qtip/bg.gif) repeat-x; + border: 1px solid #a3bad9; + font: normal 11px arial,helvetica,sans-serif; + padding: 5px; +} +.ytip .ytip-close{ + background-image: url(../images/default/basic-dialog/close.gif); + height: 15px; + position: absolute; + right: 3px; + top: 3px; + width: 15px; +} +.ytip .ytip-hd { + background: url(../images/default/basic-dialog/hd-sprite.gif) repeat-x 0px -82px; + background-color: navy; + color: #FFF; + display: block; + font: bold 11px tahoma, arial, verdana, helvetica; + padding: 4px; +} +.ytip .ytip-hd-left { + background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat 0px -41px; + display: block; + margin: 0px; + padding-left: 3px; +} +.ytip .ytip-hd-right { + background: url(../images/default/basic-dialog/hd-sprite.gif) no-repeat right 0px; + display: block; + padding-right: 3px; +} +y\:qtip, qtip{ + display: none; +} diff --git a/frontend/beta/css/yui-extensions/reset-min.css b/frontend/beta/css/yui-extensions/reset-min.css new file mode 100644 index 0000000..25a5158 --- /dev/null +++ b/frontend/beta/css/yui-extensions/reset-min.css @@ -0,0 +1,29 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} \ No newline at end of file diff --git a/frontend/beta/css/yui-extensions/resizable.css b/frontend/beta/css/yui-extensions/resizable.css new file mode 100644 index 0000000..46fef2a --- /dev/null +++ b/frontend/beta/css/yui-extensions/resizable.css @@ -0,0 +1,160 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.yresizable-handle { + position:absolute; + z-index:100; + /* ie needs these */ + font-size:1px; + line-height:6px; + overflow:hidden; + background:white; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} +.yresizable-handle-east{ + width:6px; + cursor:e-resize; + right:0px; + top:0px; + height:100%; + margin-right:-1px; /*IE rounding error*/ +} +.yresizable-handle-south{ + width:100%; + cursor:s-resize; + left:0px; + bottom:0px; + height:6px; + margin-bottom:-1px; /*IE rounding error*/ +} +.yresizable-handle-west{ + width:6px; + cursor:w-resize; + left:0px; + top:0px; + height:100%; +} +.yresizable-handle-north{ + width:100%; + cursor:n-resize; + left:0px; + top:0px; + height:6px; +} +.yresizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0px; + bottom:0px; + height:6px; + z-index:101; +} +.yresizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0px; + top:0px; + height:6px; + z-index:101; +} +.yresizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0px; + top:0px; + height:6px; + z-index:101; +} +.yresizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0px; + bottom:0px; + height:6px; + z-index:101; +} +.yresizable-over .yresizable-handle, .yresizable-pinned .yresizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.yresizable-over .yresizable-handle-east, .yresizable-pinned .yresizable-handle-east{ + background:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-west, .yresizable-pinned .yresizable-handle-west{ + background:url(../images/default/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-south, .yresizable-pinned .yresizable-handle-south{ + background:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-north, .yresizable-pinned .yresizable-handle-north{ + background:url(../images/default/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-southeast, .yresizable-pinned .yresizable-handle-southeast{ + background:url(../images/default/sizer/corners-sprite.gif); + background-position: top left; +} +.yresizable-over .yresizable-handle-northwest, .yresizable-pinned .yresizable-handle-northwest{ + background:url(../images/default/sizer/corners-sprite.gif); + background-position:bottom right; +} +.yresizable-over .yresizable-handle-northeast, .yresizable-pinned .yresizable-handle-northeast{ + background:url(../images/default/sizer/corners-sprite.gif); + background-position: bottom left; +} +.yresizable-over .yresizable-handle-southwest, .yresizable-pinned .yresizable-handle-southwest{ + background:url(../images/default/sizer/corners-sprite.gif); + background-position: top right; +} +.yresizable-proxy{ + border: 1px dashed #6593cf; + position:absolute; + overflow:hidden; + visibility:hidden; + left:0;top:0; + z-index:1001; +} +.yresizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + background:white; + z-index:20000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); + border:1px solid red; +} diff --git a/frontend/beta/css/yui-extensions/tabs.css b/frontend/beta/css/yui-extensions/tabs.css new file mode 100644 index 0000000..8eb81e0 --- /dev/null +++ b/frontend/beta/css/yui-extensions/tabs.css @@ -0,0 +1,152 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ytab-wrap { + border-bottom:1px solid #6593cf; + padding-top:2px; +} +.ytab-strip-wrap{ + width:100%; +} +.ytab-wrap table{ + position:relative; + top:0; left:0; +} +.ytab-strip td{ + padding:0; + padding-left:2px; +} +.ytab-strip a, .ytab-strip span, .ytab-strip em { + display:block; +} +.ytab-strip a { + text-decoration:none !important; + -moz-outline: none; + outline: none; + cursor:pointer; +} +.ytab-strip .ytab-text { + font:bold 11px tahoma,arial,helvetica; + color:#666; + overflow:hidden; + white-space: nowrap; + cursor:pointer; + text-overflow: ellipsis; +} +.ytab-strip .on .ytab-text { + cursor:default; + color:#083772; +} +.ytab-strip .disabled .ytab-text { + cursor:default; + color:#aaaaaa; +} +.ytab-strip .ytab-inner { + padding:4px 10px; +} + +.ytab-strip .on .ytab-right { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat right 0; +} +.ytab-strip .on .ytab-left { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat 0 -100px; +} +.ytab-strip .ytab-right { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat right -50px; +} +.ytab-strip .ytab-left { + background: url(../images/default/tabs/tab-sprite.gif) no-repeat 0 -150px; +} + +.ytab-strip a { + position:relative; + top:1px; left:0; +} +.ytab-strip .on a { + position:relative; +} +.ytab-strip .on .ytab-inner { + padding-bottom:5px; +} +/** closable tabs */ +.ytab-strip .ytab-closable .ytab-inner{ + padding-right:22px; + position:relative; +} +.ytab-strip .ytab-closable .close-icon{ + line-height: 1px; + font-size:1px; + background-image:url(../images/default/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -60px; + display:block; + position:absolute; + right:5px;top:4px; + width:12px;height:11px; + cursor:pointer; +} +.ytab-strip .on .close-icon{ + background-image:url(../images/default/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -60px; +} +.ytab-strip .ytab-closable .close-over{ + background-image:url(../images/default/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -72px; +} + +.ytabs-bottom .ytab-wrap { + border-top:1px solid #6593cf; + border-bottom:0 none; + padding-top:0; + padding-bottom:2px; +} +.ytabs-bottom .ytab-strip .ytab-right { + background: url(../images/default/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .ytab-left { + background: url(../images/default/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip .on .ytab-right { + background: url(../images/default/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .on .ytab-left { + background: url(../images/default/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip a { + position:relative; + top:0; left:0; +} +.ytabs-bottom .ytab-strip .on a { + margin-top:-1px; +} +.ytabs-bottom .ytab-strip .on .ytab-inner { + padding-top:5px; +} + diff --git a/frontend/beta/css/yui-extensions/toolbar.css b/frontend/beta/css/yui-extensions/toolbar.css new file mode 100644 index 0000000..df91c83 --- /dev/null +++ b/frontend/beta/css/yui-extensions/toolbar.css @@ -0,0 +1,115 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ytoolbar{ + background-color: #ebeadb; + border: 1px solid #cbc7b8; + display: block; + padding:2px; +} + +.mso .ytoolbar, .ygrid-mso .ytoolbar{ + border: 0px none; + background: url(../images/default/grid/mso-hd.gif); +} +.ytoolbar td,.ytoolbar span,.ytoolbar input,.ytoolbar div{ + white-space: nowrap; + font:normal 8pt arial,helvetica; +} +.ytoolbar .ytb-button-disabled .ytb-button-inner{ + color:gray; + cursor:default; +} + +/* + Default button class is icon only. Add a class with a background-image property + to your toolbar button +*/ +.ytoolbar .ytb-button-inner{ + background-position: center; + background-repeat: no-repeat; + display: block; + height: 16px; + width: 16px; + cursor:pointer; + white-space: nowrap; +} + +/* + Button class for icon and text. Add this class and a class with a background-image + to your toolbar button for both text and icon +*/ +.ytoolbar .ytb-text-icon{ + background-position: 0px 0px; + background-repeat: no-repeat; + padding-left:18px; + padding-top:1px; + width:auto; + display:block; +} + +/* + Button class for a button with only text. Add this class + to your toolbar button for a just text button +*/ +.ytoolbar .ytb-text-only{ + background:none; + padding-left:0px; + padding-top:1px; + width:auto; + display:block; +} +.ytoolbar .ytb-text{ + padding:2px; +} +.ytoolbar .ytb-button{ + padding:2px 3px; + display:block; +} +.ytoolbar .ytb-button-over{ + background:#c3d3ed url(../images/default/toolbar/btn-over-bg.gif) repeat-x; + border:1px solid #6593cf; + padding:1px 2px; +} +.ytoolbar .ytb-sep { + background-image: url(../images/default/grid/grid-split.gif); + background-position: center; + background-repeat: no-repeat; + display: block; + font-size: 1px; + height: 16px; + width:4px; + overflow: hidden; + cursor:default; + margin: 0px 2px 0px; + border:0px; +} +.mso .ytoolbar .ytb-sep, .ygrid-mso .ytoolbar .ytb-sep{ + background-image: url(../images/default/grid/grid-blue-split.gif); +} + diff --git a/frontend/beta/css/yui-extensions/tree.css b/frontend/beta/css/yui-extensions/tree.css new file mode 100644 index 0000000..9667f83 --- /dev/null +++ b/frontend/beta/css/yui-extensions/tree.css @@ -0,0 +1,193 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +.ytree-icon, .ytree-ec-icon, .ytree-elbow-line, .ytree-elbow, .ytree-elbow-end, .ytree-elbow-plus, .ytree-elbow-minus, .ytree-elbow-end-plus, .ytree-elbow-end-minus{ + border: 0 none; + height: 18px; + margin: 0px; + padding: 0px; + vertical-align: middle; + width: 16px; +} +.ytree-node-collapsed .ytree-node-icon, .ytree-node-expanded .ytree-node-icon, .ytree-node-leaf .ytree-node-icon{ + border: 0 none; + height: 16px; + margin: 0px; + padding: 0px; + vertical-align: middle; + width: 16px; + background-position:center; +} + +/* some default icons for leaf/folder */ +.ytree-node-collapsed .ytree-node-icon{ + background:transparent url(../images/default/tree/folder.gif); +} +.ytree-node-expanded .ytree-node-icon{ + background:transparent url(../images/default/tree/folder-open.gif); +} +.ytree-node-leaf .ytree-node-icon{ + background:transparent url(../images/default/tree/leaf.gif); +} + +/* loading icon */ +.ytree-node-loading .ytree-node-icon{ + background:transparent url(../images/default/tree/loading.gif) !important; +} +.ytree-node-loading a span{ + font-style: italic; + color:#444444; +} + +/* Line styles */ +.ytree-lines .ytree-elbow{ + background:transparent url(../images/default/tree/elbow.gif); +} +.ytree-lines .ytree-elbow-plus{ + background:transparent url(../images/default/tree/elbow-plus.gif); +} +.ytree-lines .ytree-elbow-minus{ + background:transparent url(../images/default/tree/elbow-minus.gif); +} +.ytree-lines .ytree-elbow-end{ + background:transparent url(../images/default/tree/elbow-end.gif); +} +.ytree-lines .ytree-elbow-end-plus{ + background:transparent url(../images/default/tree/elbow-end-plus.gif); +} +.ytree-lines .ytree-elbow-end-minus{ + background:transparent url(../images/default/tree/elbow-end-minus.gif); +} +.ytree-lines .ytree-elbow-line{ + background:transparent url(../images/default/tree/elbow-line.gif); +} + +/* No line styles */ +.ytree-no-lines .ytree-elbow{ + background:transparent; +} +.ytree-no-lines .ytree-elbow-plus{ + background:transparent url(../images/default/tree/elbow-plus-nl.gif); +} +.ytree-no-lines .ytree-elbow-minus{ + background:transparent url(../images/default/tree/elbow-minus-nl.gif); +} +.ytree-no-lines .ytree-elbow-end{ + background:transparent; +} +.ytree-no-lines .ytree-elbow-end-plus{ + background:transparent url(../images/default/tree/elbow-end-plus-nl.gif); +} +.ytree-no-lines .ytree-elbow-end-minus{ + background:transparent url(../images/default/tree/elbow-end-minus-nl.gif); +} +.ytree-no-lines .ytree-elbow-line{ + background:transparent; +} + +.ytree-elbow-plus, .ytree-elbow-minus, .ytree-elbow-end-plus, .ytree-elbow-end-minus{ + cursor:pointer; +} + +.ytree-node{ + color: black; + font: normal 11px arial, helvetica, sans-serif; + white-space: nowrap; +} +.ytree-node a, .ydd-drag-ghost a{ + text-decoration:none; + color:black; + -khtml-user-select:normal; + -moz-user-select:normal; +} +.ytree-node a span, .ydd-drag-ghost a span{ + text-decoration:none; + color:black; + padding:1px 3px 1px 2px; +} +.ytree-node .ytree-node-disabled a span{ + color:gray !important; +} +.ytree-node .ytree-node-disabled .ytree-node-icon{ + -moz-opacity: 0.5; + opacity:.5; + filter: alpha(opacity=50); +} +.ytree-node .ytree-node-inline-icon{ + background:transparent; +} +.ytree-node a:hover, .ydd-drag-ghost a:hover{ + text-decoration:none; +} +.ytree-node div.ytree-drag-insert-below{ + border-bottom:1px dotted #3366cc; +} +.ytree-node div.ytree-drag-insert-above{ + border-top:1px dotted #3366cc; +} +.ytree-dd-underline .ytree-node div.ytree-drag-insert-below{ + border-bottom:0px none; +} +.ytree-dd-underline .ytree-node div.ytree-drag-insert-above{ + border-top:0px none; +} +.ytree-dd-underline .ytree-node div.ytree-drag-insert-below a{ + border-bottom:2px solid #3366cc; +} +.ytree-dd-underline .ytree-node div.ytree-drag-insert-above a{ + border-top:2px solid #3366cc; +} +.ytree-node .ytree-drag-append a span{ + background:#dddddd; + border:1px dotted gray; +} +.ytree-node .ytree-selected a span{ + background:#3366cc; + color:white; +} +.ydd-drag-ghost .ytree-node-indent, .ydd-drag-ghost .ytree-ec-icon{ + display:none !important; +} +.ytree-drop-ok-append .ydd-drop-icon{ + background-image: url(../images/default/tree/drop-add.gif); +} +.ytree-drop-ok-above .ydd-drop-icon{ + background-image: url(../images/default/tree/drop-over.gif); +} +.ytree-drop-ok-below .ydd-drop-icon{ + background-image: url(../images/default/tree/drop-under.gif); +} +.ytree-drop-ok-between .ydd-drop-icon{ + background-image: url(../images/default/tree/drop-between.gif); +} +.ylayer-shadow{ + background:#cccccc; + opacity:.3; + -moz-opacity:.3; + filter: alpha(opacity=30); +} diff --git a/frontend/beta/css/yui-extensions/ytheme-aero.css b/frontend/beta/css/yui-extensions/ytheme-aero.css new file mode 100644 index 0000000..10d8ec0 --- /dev/null +++ b/frontend/beta/css/yui-extensions/ytheme-aero.css @@ -0,0 +1,361 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/** +* Tabs +*/ +.ytab-wrap, .ylayout-panel .ytabs-top .ytab-wrap { + background:#deecfd; + border:1px solid #8db2e3; + padding-bottom:2px; + padding-top:0px; +} +.ytab-strip-wrap{ + padding-top:1px; + background:#cedff5 url(../images/aero/tabs/tab-strip-bg.gif) repeat-x bottom; + border-bottom:1px solid #8db2e3; +} +.ytab-strip .ytab-text { + color:#15428b; + font-weight:normal; +} +.ytab-strip .on .ytab-text { + cursor:default; + color:#15428b; +} +.ytabs-top .ytab-strip .on .ytab-right { + background: url(../images/aero/tabs/tab-sprite.gif) no-repeat right 0px; +} +.ytabs-top .ytab-strip .on .ytab-left,.ytabs-top .ytab-strip .on a:hover .ytab-left{ + background: url(../images/aero/tabs/tab-sprite.gif) no-repeat 0px -100px; +} +.ytabs-top .ytab-strip .ytab-right { + background:transparent url(../images/aero/tabs/tab-sprite.gif) no-repeat right -50px; +} +.ytabs-top .ytab-strip .ytab-left { + background:transparent url(../images/aero/tabs/tab-sprite.gif) no-repeat 0px -150px; +} +.ytabs-top .yui-ext-tabbody { + border:1px solid #8db2e3; + border-top:0px none; +} +.ytabs-bottom .ytab-wrap, .ylayout-panel .ytabs-bottom .ytab-wrap { + background:#deecfd; + border:1px solid #8db2e3; + padding-top:2px; + padding-bottom:0px; +} +.ytabs-bottom .ytab-strip-wrap{ + padding-top:0px; + padding-bottom:1px; + background:#cedff5 url(../images/aero/tabs/tab-strip-btm-bg.gif) repeat-x top; + border-top:1px solid #8db2e3; + border-bottom:0px none; +} +.ytabs-bottom .ytab-strip .ytab-right { + background:transparent url(../images/aero/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip .ytab-left { + background:transparent url(../images/aero/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .on .ytab-right,.ytabs-bottom .ytab-strip .on a:hover { + background: url(../images/aero/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .on .ytab-left,.ytabs-bottom .ytab-strip .on a:hover .ytab-left { + background: url(../images/aero/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .yui-ext-tabbody { + border:1px solid #8db2e3; + border-bottom:0px none; +} +/** +* Basic-Dialog +*/ +.ydlg-proxy { + background:#C7DFFC; + border:1px solid #A5CCF9; +} +.ydlg-shadow{ + background:#cccccc; + opacity:.3; + -moz-opacity:.3; + filter: alpha(opacity=30); +} +.ydlg { + background:transparent; +} +.ydlg .ydlg-hd { + background: url(../images/aero/basic-dialog/hd-sprite.gif) repeat-x 0px -82px; + background-color:#aabaca; + color:#15428b; + zoom:1; + padding-top:7px; +} +.ydlg .ydlg-hd-left { + opacity:.85;-moz-opacity:.85;filter:alpha(opacity=80); + background: url(../images/aero/basic-dialog/hd-sprite.gif) no-repeat 0px -41px; + zoom:1; +} +.ydlg-modal .ydlg-hd-left { + opacity:.75;-moz-opacity:.75;filter:alpha(opacity=70); +} + +.ydlg .ydlg-hd-right { + background: url(../images/aero/basic-dialog/hd-sprite.gif) no-repeat right 0px; + zoom:1; +} +.ydlg .ydlg-dlg-body{ + padding:0px 0px 0px; + position:absolute; + top:24px;left:0px; + z-index:1; + border:0px none; + background:transparent; +} +.ydlg .ydlg-bd{ + background:#fff; + border:1px solid #96b9e6; +} +.ydlg .ydlg-ft{ + border:0px none; + background:transparent; + padding-bottom:8px; +} +.ydlg .ydlg-bg{ + filter:alpha(opacity=80); + opacity:.85; + -moz-opacity:.85; + zoom:1; +} +.ydlg-modal .ydlg-bg { + opacity:.75;-moz-opacity:.75;filter:alpha(opacity=70); +} +.ydlg .ydlg-bg-center { + padding: 2px 7px 7px 7px; + background:transparent url(../images/aero/basic-dialog/bg-center.gif) repeat-x bottom; + zoom:1; +} +.ydlg .ydlg-bg-left{ + padding-left:7px; + background:transparent url(../images/aero/basic-dialog/bg-left.gif) no-repeat bottom left; + zoom:1; +} +.ydlg .ydlg-bg-right{ + padding-right:7px; + background:transparent url(../images/aero/basic-dialog/bg-right.gif) no-repeat bottom right; + zoom:1; +} +.ydlg-auto-tabs .ydlg-dlg-body, .ydlg-auto-layout .ydlg-dlg-body{ + background:transparent; + border:0px none; +} +.ydlg-auto-tabs .ydlg-bd, .ydlg-auto-layout .ydlg-bd{ + background:#fff; + border:1px solid #e9f3f5; +} +.ydlg-auto-tabs .ytabs-top .yui-ext-tabbody,.ydlg-auto-tabs .ytabs-bottom .yui-ext-tabbody{ + border-color:#8db2e3; +} +.ydlg-auto-tabs .ytabs-top .ytab-wrap,.ydlg-auto-tabs .ytabs-bottom .ytab-wrap{ + border-color:#8db2e3; +} +.ydlg .ydlg-close { + width:21px; + height:20px; + top:5px; + right:5px; + opacity:.85;-moz-opacity:.85;filter:alpha(opacity=80); + background-image:url(../images/aero/basic-dialog/aero-close.gif); + zoom:1; +} +.ydlg .ydlg-close-over { + background-image:url(../images/aero/basic-dialog/aero-close-over.gif); +} +.ydlg div.yresizable-handle-east{ + background-image:url(../images/aero/s.gif); + border:0px none; +} +.ydlg div.yresizable-handle-south{ + background-image:url(../images/aero/s.gif); + border:0px none; +} +.ydlg div.yresizable-handle-west{ + background-image:url(../images/aero/s.gif); + border:0px none; +} +.ydlg div.yresizable-handle-southeast{ + background-image:url(../images/aero/basic-dialog/se-handle.gif); + background-position: bottom right; + width:9px; + height:9px; + border:0px; + right:2px; + bottom:2px; +} +.ydlg div.yresizable-handle-southwest{ + background-image:url(../images/aero/s.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0px; +} +.ydlg div.yresizable-handle-north{ + background-image:url(../images/aero/s.gif); + border:0px none; +} + +#mb-dlg .ydlg-bd{ + background:#CFE0F5; + border:0px none; +} + +/* BorderLayout */ +.ylayout-container{ + background:#deecfd; +} +.ylayout-collapsed{ + background-color:#deecfd; + border:1px solid #99bbe8; +} +.ylayout-collapsed-over{ + background-color:#F5F9FE; +} +.ylayout-panel{ + border:1px solid #99bbe8; +} +.ylayout-nested-layout .ylayout-panel { + border:0px none; +} +.ylayout-split{ + background-color:#deecfd; +} +.ylayout-panel-hd{ + background-image: url(../images/aero/layout/panel-title-light-bg.gif); + border-bottom:1px solid #c0d7f4; +} +.ylayout-panel-hd-text { + color:#15428b; +} + +.ylayout-split-h{ + background:#deecfd; +} +.ylayout-split-v{ + background:#deecfd; +} +.ylayout-panel .ytabs-top .ytab-wrap{ + border:0px none; + border-bottom:1px solid #8db2e3; +} +.ylayout-panel .ytabs-bottom .ytab-wrap{ + border:0px none; + border-top:1px solid #8db2e3; +} +.ylayout-container .yui-ext-tabbody{ + border:0px none; +} + +.ylayout-nested-layout .ylayout-panel-north { + border-bottom:1px solid #99bbe8; +} +.ylayout-nested-layout .ylayout-panel-south { + border-top:1px solid #99bbe8; +} +.ylayout-nested-layout .ylayout-panel-east { + border-left:1px solid #99bbe8; +} +.ylayout-nested-layout .ylayout-panel-west { + border-right:1px solid #99bbe8; +} +.ylayout-panel-dragover { + border: 2px solid #99bbe8; +} +.ylayout-panel-proxy { + background-image: url(../images/aero/layout/gradient-bg.gif); + background-color:#f3f2e7; + border:1px dashed #99bbe8; +} +/** Resizable */ + +.yresizable-proxy{ + border: 1px dashed #3b5a82; +} + +/* grid */ +.ygrid-hd{ + border-bottom:0px; + background:none; +} +.ygrid-hd-body { + border-bottom:0px none; +} +.ygrid-hd-over { + border-bottom:0px none; +} +.ygrid-hd-over .ygrid-hd-body{ + background:none; + border-bottom:0px none; +} +.ygrid-hd-over .ygrid-hd-body{ + background-color: transparent; + border-bottom:0px; +} +.ygrid-hd-split { + background-image: url(../images/aero/grid/grid-split.gif); +} +.ygrid-hrow{ + background: url(../images/aero/grid/grid-hrow.gif); + height: 22px; + border:0px none; +} +.ygrid-row-alt{ + background-color: #f5f5f5; +} +.ygrid-row{ + border-bottom: 1px solid #eeeeee; +} +.ygrid-col{ + border-right:1px solid #eeeeee; +} +.ygrid-sort-col .ygrid-hd-body { + padding-bottom:4px; +} + +/** Toolbar */ +.ytoolbar{ + border:0px none; + background: #E2ECF8; + padding:1px 3px; + border-bottom:1px solid #c0d7f4; +} +.ytoolbar .ytb-button-over{ + border:1px solid #8db2e3; +} +.ytoolbar .ytb-sep{ + background-image: url(../images/aero/grid/grid-blue-split.gif); +} diff --git a/frontend/beta/css/yui-extensions/ytheme-gray.css b/frontend/beta/css/yui-extensions/ytheme-gray.css new file mode 100644 index 0000000..675fed1 --- /dev/null +++ b/frontend/beta/css/yui-extensions/ytheme-gray.css @@ -0,0 +1,300 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/** +* Basic-Dialog +*/ +.ydlg-proxy { + background-image: url(../images/gray/layout/gradient-bg.gif); + background-color:#EAE8D5; + border:1px solid #b3b6b0; +} +.ydlg-shadow{ + background:#aaaaaa; +} +.ydlg-proxy .tabset{ + background:url(../images/gray/layout/gradient-bg.gif); +} +.ydlg .ydlg-hd { + background: url(../images/gray/basic-dialog/hd-sprite.gif) repeat-x 0px -82px; + background-color:#333333; +} +.ydlg .ydlg-hd-left { + background: url(../images/gray/basic-dialog/hd-sprite.gif) no-repeat 0px -41px; +} +.ydlg .ydlg-hd-right { + background: url(../images/gray/basic-dialog/hd-sprite.gif) no-repeat right 0px; +} +.ydlg .ydlg-dlg-body{ + background:#efefec; + border:1px solid #b3b6b0; + border-top:0px none; +} +.ydlg .ytabs-top .yui-ext-tabbody{ + border:1px solid #b3b6b0; + border-top:0px none; +} +.ydlg .ytabs-bottom .yui-ext-tabbody{ + border:1px solid #b3b6b0; + border-bottom:0px none; +} +.ydlg .ylayout-container .yui-ext-tabbody{ + border:0px none; +} +.ydlg .ydlg-close { + background-image:url(../images/gray/basic-dialog/close.gif); +} +.ydlg div.yresizable-handle-east{ + background-image:url(../images/gray/basic-dialog/e-handle.gif); + border:0px none; +} +.ydlg div.yresizable-handle-south{ + background-image:url(../images/gray/basic-dialog/s-handle.gif); + border:0px none; +} +.ydlg div.yresizable-handle-west{ + background-image:url(../images/gray/basic-dialog/e-handle.gif); + border:0px none; +} +.ydlg div.yresizable-handle-southeast{ + background-image:url(../images/gray/basic-dialog/se-handle.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0px; +} +.ydlg div.yresizable-handle-southwest{ + background-image:url(../images/gray/sizer/sw-handle-dark.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0px; +} +.ydlg div.yresizable-handle-north{ + background-image:url(../images/gray/s.gif); + border:0px none; +} + +/** +* Tabs +*/ +.ytab-wrap { + border-bottom:1px solid #aca899; +} +.ytab-strip .on .ytab-text { + cursor:default; + color:#333333; +} +.ytabs-top .ytab-strip .on .ytab-right { + background: url(../images/gray/tabs/tab-sprite.gif) no-repeat right 0px; +} +.ytabs-top .ytab-strip .on .ytab-left { + background: url(../images/gray/tabs/tab-sprite.gif) no-repeat 0px -100px; +} +.ytabs-top .ytab-strip .ytab-right { + background: url(../images/gray/tabs/tab-sprite.gif) no-repeat right -50px; +} +.ytabs-top .ytab-strip .ytab-left { + background: url(../images/gray/tabs/tab-sprite.gif) no-repeat 0px -150px; +} +.ytab-strip .ytab-closable .close-icon{ + background-image:url(../images/gray/layout/layout-sprite.gif); + background-position: 50% -60px; +} +.ytab-strip .on .close-icon{ + background-image:url(../images/gray/layout/layout-sprite.gif); + background-position: 50% -60px; +} +.ytab-strip .ytab-closable .close-over{ + background-image:url(../images/gray/layout/layout-sprite.gif); + background-position: 50% -72px; +} + +.ytabs-bottom .ytab-wrap { + border-bottom:0px none; + padding-top:0px; + border-top:1px solid #aca899; +} +.ytabs-bottom .ytab-strip .ytab-right { + background: url(../images/gray/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .ytab-left { + background: url(../images/gray/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip .on .ytab-right { + background: url(../images/gray/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .on .ytab-left { + background: url(../images/gray/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} + +/* QuickTips */ + +.ytip .ytip-hd-right{ + background: url(../images/gray/basic-dialog/hd-sprite.gif) no-repeat right 0px; +} +.ytip .ytip-hd-left{ + background: url(../images/gray/basic-dialog/hd-sprite.gif) no-repeat 0px -41px; +} +.ytip .ytip-hd{ + background: url(../images/gray/basic-dialog/hd-sprite.gif) repeat-x 0px -82px; +} +.ytip .ytip-close{ + background-image: url(../images/gray/basic-dialog/close.gif); +} +.ytip .ytip-bd{ + background: #e7e7e7 url(../images/gray/qtip/bg.gif); + border: 1px solid #ababab; +} + +/* BorderLayout */ + +.ylayout-container{ + background-color:#f3f2e7; +} +.ylayout-collapsed{ + background-color:#f3f2e7; + border:1px solid #aca899; +} +.ylayout-collapsed-over{ + background-color:#fbfbef; +} +.ylayout-panel{ + border:1px solid #aca899; +} +.ylayout-nested-layout .ylayout-panel { + border:0px none; +} +.ylayout-split{ + background-color:#f3f2e7; +} +.ylayout-panel-hd{ + background-image: url(../images/gray/layout/panel-title-light-bg.gif); + border-bottom:1px solid #aca899; +} +.ylayout-tools-button-over{ + border:1px solid #aca899; +} +.ylayout-close{ + background-image:url(../images/gray/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -48px; +} +.ylayout-collapse-west,.ylayout-expand-east{ + background-image:url(../images/gray/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% 0; +} +.ylayout-expand-west,.ylayout-collapse-east{ + background-image:url(../images/gray/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -12px; +} +.ylayout-collapse-north,.ylayout-expand-south{ + background-image:url(../images/gray/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -24px; +} +.ylayout-expand-north,.ylayout-collapse-south{ + background-image:url(../images/gray/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -36px; +} +.ylayout-split-h{ + background-image:url(../images/gray/sizer/e-handle-dark.gif); +} +.ylayout-split-v{ + background-image:url(../images/gray/sizer/s-handle-dark.gif); +} +.ylayout-panel .ytab-wrap{ + background:url(../images/gray/layout/gradient-bg.gif); +} +.ylayout-nested-layout .ylayout-panel-north { + border-bottom:1px solid #aca899; +} +.ylayout-nested-layout .ylayout-panel-south { + border-top:1px solid #aca899; +} +.ylayout-nested-layout .ylayout-panel-east { + border-left:1px solid #aca899; +} +.ylayout-nested-layout .ylayout-panel-west { + border-right:1px solid #aca899; +} +.ylayout-panel-dragover { + border: 2px solid #aca899; +} +.ylayout-panel-proxy { + background-image: url(../images/gray/layout/gradient-bg.gif); + background-color:#f3f2e7; + border:1px dashed #aca899; +} +/** Resizable */ + +.yresizable-over .yresizable-handle-east, .yresizable-pinned .yresizable-handle-east{ + background:url(../images/gray/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-east, .yresizable-pinned .yresizable-handle-west{ + background:url(../images/gray/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-south, .yresizable-pinned .yresizable-handle-south{ + background:url(../images/gray/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-south, .yresizable-pinned .yresizable-handle-north{ + background:url(../images/gray/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-southeast, .yresizable-pinned .yresizable-handle-southeast{ + background:url(../images/gray/sizer/se-handle.gif); + background-position: top left; +} +.yresizable-over .yresizable-handle-northwest,.yresizable-pinned .yresizable-handle-northwest{ + background:url(../images/gray/sizer/nw-handle.gif); + background-position:bottom right; +} +.yresizable-over .yresizable-handle-northeast,.yresizable-pinned .yresizable-handle-northeast{ + background:url(../images/gray/sizer/ne-handle.gif); + background-position: bottom left; +} +.yresizable-over .yresizable-handle-southwest,.yresizable-pinned .yresizable-handle-southwest{ + background:url(../images/gray/sizer/sw-handle.gif); + background-position: top right; +} +.yresizable-proxy{ + border: 1px dashed #615e55; +} + +/** Toolbar */ +.ytoolbar{ + border:0px none; + background: #efefe3 url(../images/gray/toolbar/gray-bg.gif) repeat-x; + padding:3px; +} diff --git a/frontend/beta/css/yui-extensions/ytheme-vista.css b/frontend/beta/css/yui-extensions/ytheme-vista.css new file mode 100644 index 0000000..2770566 --- /dev/null +++ b/frontend/beta/css/yui-extensions/ytheme-vista.css @@ -0,0 +1,403 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/** +* Tabs +*/ +.ytab-wrap { + background:#4f4f4f; + border-bottom:1px solid #b3b6b0; +} +.ytab-strip .ytab-text { + color:white; + font-weight:normal; +} +.ytab-strip .on .ytab-text { + cursor:default; + color:#333333; +} +.ytabs-top .ytab-strip a:hover { + background:transparent url(../images/vista/tabs/tab-sprite.gif) no-repeat right -50px; +} +.ytabs-top .ytab-strip a:hover .ytab-left { + background:transparent url(../images/vista/tabs/tab-sprite.gif) no-repeat 0 -150px; +} +.ytabs-top .ytab-strip .on .ytab-right, .ytabs-top .ytab-strip .on a:hover { + background: url(../images/vista/tabs/tab-sprite.gif) no-repeat right 0; +} +.ytabs-top .ytab-strip .on .ytab-left, .ytabs-top .ytab-strip .on a:hover .ytab-left { + background: url(../images/vista/tabs/tab-sprite.gif) no-repeat 0 -100px; +} +.ytabs-top .ytab-strip .ytab-right { + background:transparent; +} +.ytabs-top .ytab-strip .ytab-left { + background:transparent; +} +.ytab-strip .ytab-closable .close-icon{ + background-image:url(../images/vista/layout/layout-sprite.gif); + background-position: 50% -60px; +} +.ytab-strip .on .close-icon{ + background-image:url(../images/vista/layout/layout-sprite.gif); + background-position: 50% -72px; +} +.ytab-strip .ytab-closable .close-over{ + background-image:url(../images/vista/layout/layout-sprite.gif); + background-position: 50% -72px; +} + +.ytabs-bottom .ytab-strip { + background:#4f4f4f; +} +.ytabs-bottom .ytab-strip a:hover { + background:transparent url(../images/vista/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip a:hover .ytab-left{ + background:transparent url(../images/vista/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-wrap { + border-bottom:0px none; + padding-top:0px; + border-top:1px solid #b3b6b0; +} +.ytabs-bottom .ytab-strip .ytab-right { + background:transparent; +} +.ytabs-bottom .ytab-strip .ytab-left { + background:transparent; +} +.ytabs-bottom .ytab-strip .on .ytab-right,.ytabs-bottom .ytab-strip .on a:hover { + background: url(../images/vista/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .on .ytab-left,.ytabs-bottom .ytab-strip .on a:hover .ytab-left { + background: url(../images/vista/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} +/** +* Basic-Dialog +*/ +.ydlg-proxy { + background:#d3d6d0; + border:2px solid #b3b6b0; +} +.ydlg-shadow{ + background:#cccccc; + opacity:.3; + -moz-opacity:.3; + filter: alpha(opacity=30); +} +.ydlg .ydlg-hd { + background: url(../images/vista/basic-dialog/hd-sprite.gif) repeat-x 0px -82px; + background-color:#333333; + zoom:1; +} +.ydlg .ydlg-hd-left { + opacity:.95;-moz-opacity:.95;filter:alpha(opacity=90); + background: url(../images/vista/basic-dialog/hd-sprite.gif) no-repeat 0px -41px; + zoom:1; +} +.ydlg .ydlg-hd-right { + background: url(../images/vista/basic-dialog/hd-sprite.gif) no-repeat right 0px; + zoom:1; +} +.ydlg .ydlg-dlg-body{ + background:#fff; + border:0 none; + border-top:0px none; + padding:0px 0px 0px; + position:absolute; + top:24px;left:0px; + z-index:1; +} +.ydlg-auto-tabs .ydlg-dlg-body{ + background:transparent; +} +.ydlg-auto-tabs .ytabs-top .ytab-wrap{ + background:transparent; +} +.ydlg .ydlg-ft{ + border-top:1px solid #b3b6b0; + background:#F0F0F0; + padding-bottom:8px; +} +.ydlg .ydlg-bg{ + opacity:.90;-moz-opacity:.90;filter:alpha(opacity=85); + zoom:1; +} +.ydlg .ydlg-bg-left,.ydlg .ydlg-bg-center,.ydlg .ydlg-bg-right{ +} +.ydlg .ydlg-bg-center { + padding: 0px 4px 4px 4px; + background:transparent url(../images/vista/basic-dialog/bg-center.gif) repeat-x bottom; + zoom:1; +} +.ydlg .ydlg-bg-left{ + padding-left:4px; + background:transparent url(../images/vista/basic-dialog/bg-left.gif) no-repeat bottom left; + zoom:1; +} +.ydlg .ydlg-bg-right{ + padding-right:4px; + background:transparent url(../images/vista/basic-dialog/bg-right.gif) no-repeat bottom right; + zoom:1; +} +.ydlg .ytabs-top .yui-ext-tabbody{ + border:0px none; +} +.ydlg .ytabs-bottom .yui-ext-tabbody{ + border:1px solid #b3b6b0; + border-bottom:0px none; +} +.ydlg .ylayout-container .yui-ext-tabbody{ + border:0px none; +} +.ydlg .ydlg-close { + background-image:url(../images/vista/basic-dialog/close.gif); +} +.ydlg div.yresizable-handle-east{ + background-image:url(../images/vista/s.gif); + border:0px none; +} +.ydlg div.yresizable-handle-south{ + background-image:url(../images/vista/s.gif); + border:0px none; +} +.ydlg div.yresizable-handle-west{ + background-image:url(../images/vista/s.gif); + border:0px none; +} +.ydlg div.yresizable-handle-southeast{ + background-image:url(../images/vista/s.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0px; +} +.ydlg div.yresizable-handle-southwest{ + background-image:url(../images/vista/s.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0px; +} +.ydlg div.yresizable-handle-north{ + background-image:url(../images/vista/s.gif); + border:0px none; +} + +/* QuickTips */ + +.ytip .ytip-hd-right{ + background: url(../images/vista/basic-dialog/hd-sprite.gif) no-repeat right 0px; +} +.ytip .ytip-hd-left{ + background: url(../images/vista/basic-dialog/hd-sprite.gif) no-repeat 0px -41px; +} +.ytip .ytip-hd{ + background: url(../images/vista/basic-dialog/hd-sprite.gif) repeat-x 0px -82px; +} +.ytip .ytip-close{ + background-image: url(../images/vista/basic-dialog/close.gif); +} +.ytip .ytip-bd{ + background: #e7e7e7 url(../images/vista/qtip/bg.gif); + border: 1px solid #ababab; +} + +/* BorderLayout */ +.ylayout-container{ + background:#4f4f4f; +} +.ylayout-collapsed{ + background-color:#9f9f9f; + border:1px solid #4c535c; +} +.ylayout-collapsed-over{ + background-color:#bfbfbf; +} +.ylayout-panel{ + border:1px solid #4c535c; +} +.ylayout-nested-layout .ylayout-panel { + border:0px none; +} +.ylayout-split{ + background-color:#f3f2e7; +} +.ylayout-panel-hd{ + background-image: url(../images/vista/layout/panel-title-bg.gif); + border-bottom:1px solid #b5bac1; +} +.ylayout-panel-hd-text{ + color:white; +} +.ylayout-tools-button-over{ + border:1px solid #4c535c; + background:#9f9f9f url(../images/vista/layout/panel-title-bg.gif) repeat-x; +} +.ylayout-close{ + background-image:url(../images/vista/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -60px; +} +.ylayout-collapse-west,.ylayout-expand-east{ + background-image:url(../images/vista/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% 0; +} +.ylayout-expand-west,.ylayout-collapse-east{ + background-image:url(../images/vista/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -12px; +} +.ylayout-collapse-north,.ylayout-expand-south{ + background-image:url(../images/vista/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -24px; +} +.ylayout-expand-north,.ylayout-collapse-south{ + background-image:url(../images/vista/layout/layout-sprite.gif); + background-repeat: no-repeat; + background-position: 50% -36px; +} +.ylayout-split-h{ + background:#9f9f9f; +} +.ylayout-split-v{ + background:#9f9f9f; +} +.ylayout-panel .ytab-wrap{ + background:#4f4f4f; +} +.ylayout-nested-layout .ylayout-panel-north { + border-bottom:1px solid #4c535c; +} +.ylayout-nested-layout .ylayout-panel-south { + border-top:1px solid #4c535c; +} +.ylayout-nested-layout .ylayout-panel-east { + border-left:1px solid #4c535c; +} +.ylayout-nested-layout .ylayout-panel-west { + border-right:1px solid #4c535c; +} +.ylayout-panel-dragover { + border: 2px solid #4c535c; +} +.ylayout-panel-proxy { + background-image: url(../images/vista/layout/gradient-bg.gif); + background-color:#f3f2e7; + border:1px dashed #4c535c; +} +/** Resizable */ + +.yresizable-over .yresizable-handle-east, .yresizable-pinned .yresizable-handle-east{ + background:url(../images/vista/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-east, .yresizable-pinned .yresizable-handle-west{ + background:url(../images/vista/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-south, .yresizable-pinned .yresizable-handle-south{ + background:url(../images/vista/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-south, .yresizable-pinned .yresizable-handle-north{ + background:url(../images/vista/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-southeast, .yresizable-pinned .yresizable-handle-southeast{ + background:url(../images/vista/sizer/se-handle.gif); + background-position: top left; +} +.yresizable-over .yresizable-handle-northwest,.yresizable-pinned .yresizable-handle-northwest{ + background:url(../images/vista/sizer/nw-handle.gif); + background-position:bottom right; +} +.yresizable-over .yresizable-handle-northeast,.yresizable-pinned .yresizable-handle-northeast{ + background:url(../images/vista/sizer/ne-handle.gif); + background-position: bottom left; +} +.yresizable-over .yresizable-handle-southwest,.yresizable-pinned .yresizable-handle-southwest{ + background:url(../images/vista/sizer/sw-handle.gif); + background-position: top right; +} +.yresizable-proxy{ + border: 1px dashed #615e55; +} + +/** Toolbar */ +.ytoolbar{ + border:0px none; + background: #efefe3 url(../images/vista/toolbar/gray-bg.gif) repeat-x; + padding:3px; +} +.ytoolbar .ytb-button-over{ + border:1px solid transparent; + border-bottom:1px solid #bbbbbb; + border-top:1px solid #eeeeee; + background:#9f9f9f url(../images/vista/grid/grid-vista-hd.gif) repeat-x; +} +/* grid */ +.ygrid-hd{ + border-bottom:0px; + background:none; +} +.ygrid-hd-body { + border-bottom: 1px solid #b3bcc0; +} +.ygrid-hd-over{ + border-bottom:0px; +} +.ygrid-hd-over .ygrid-hd-body{ + background-color: transparent; + border-bottom:0px; +} +.ygrid-hd-split { + background-image: url(../images/vista/grid/grid-split.gif); +} +.ygrid-hrow{ + background: url(../images/vista/grid/grid-vista-hd.gif); + height: 21px; +} +.ygrid-row-alt{ + background-color: #f5f5f5; +} +.ygrid-row-selected{ + background-color: #535353 !important; + color: white; +} +.ygrid-row-selected span{ + color: white !important; +} +.ygrid-wrap-body { +} +.ytoolbar .ytb-sep{ + background-image: url(../images/vista/grid/grid-split.gif); +} diff --git a/frontend/beta/css/yui/calendar.css b/frontend/beta/css/yui/calendar.css new file mode 100644 index 0000000..a634e50 --- /dev/null +++ b/frontend/beta/css/yui/calendar.css @@ -0,0 +1,189 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +Version 0.11.3 +*/ + +.yui-cal2upwrapper {*height:1%;} /* IE */ +.yui-cal2upwrapper:after {content:'.';clear:both;display:block;visibility:hidden;height:0;} /* others */ + +.yui-calcontainer { + float:left; + padding:5px; + background-color:#F7F9FB; + border:1px solid #7B9EBD; +} + +.yui-calcontainer .title { + font:100% sans-serif; + color:#000; + font-weight:bold; + margin-bottom:5px; + height:auto; + position:relative; +} + +.yui-calcontainer .title .close-icon { + position:absolute; + right:0; + top:0; + border:none; +} + +.yui-calcontainer .cal2up { + float:left; +} + +.yui-calendar .calnavleft { + position:absolute; + background-repeat:no-repeat; + cursor:pointer; + top:2px; + bottom:0; + width:9px; + height:12px; + left:2px; +} + +.yui-calendar .calnavright { + position:absolute; + background-repeat:no-repeat; + cursor:pointer; + top:2px; + bottom:0; + width:9px; + height:12px; + right:2px; +} + +/* Calendar element styles */ + +.yui-calendar { + font:100% sans-serif; + text-align:center; + border-spacing:0; + border-collapse:separate; +} + +.yui-calendar td.calcell { + padding:.1em .2em; + border:1px solid #E0E0E0; + background-color:#FFF; +} + +.yui-calendar td.calcell a { + color:#003DB8; + text-decoration:none; +} + +.yui-calendar td.calcell.today { + border:1px solid #000; +} + +.yui-calendar td.calcell.oom { + cursor:default; + color:#999; + background-color:#EEE; + border:1px solid #E0E0E0; +} + +.yui-calendar td.calcell.selected { + color:#003DB8; + background-color:#FFF19F; + border:1px solid #FF9900; +} + +.yui-calendar td.calcell.calcellhover { + cursor:pointer; + color:#FFF; + background-color:#FF9900; + border:1px solid #FF9900; +} + +.yui-calendar td.calcell.calcellhover a { + color:#FFF; +} + +.yui-calendar td.calcell.restricted { + text-decoration:line-through; +} + +.yui-calendar td.calcell.previous { + color:#CCC; +} + +.yui-calendar td.calcell.highlight1 { background-color:#CCFF99; } +.yui-calendar td.calcell.highlight2 { background-color:#99CCFF; } +.yui-calendar td.calcell.highlight3 { background-color:#FFCCCC; } +.yui-calendar td.calcell.highlight4 { background-color:#CCFF99; } + + +.yui-calendar .calhead { + border:1px solid #E0E0E0; + vertical-align:middle; + background-color:#FFF; +} + +.yui-calendar .calheader { + position:relative; + width:100%; + text-align:center; +} + +.yui-calendar .calheader img { + border:none; +} + +.yui-calendar .calweekdaycell { + color:#666; + font-weight:normal; +} + +.yui-calendar .calfoot { + background-color:#EEE; +} + +.yui-calendar .calrowhead, .yui-calendar .calrowfoot { + color:#666; + font-size:9px; + font-style:italic; + font-weight:normal; + width:15px; +} + +.yui-calendar .calrowhead { + border-right-width:2px; +} + +/*Specific changes for calendar running under fonts/reset */ +.yui-calendar a:hover {background:inherit;} +p#clear {clear:left; padding-top:10px;} diff --git a/frontend/beta/css/yui/container.css b/frontend/beta/css/yui/container.css new file mode 100644 index 0000000..1d7154c --- /dev/null +++ b/frontend/beta/css/yui/container.css @@ -0,0 +1,240 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +Version 0.11.4 +*/ + +.overlay { + position:absolute; + display:block; +} + +.tt { + visibility:hidden; + position:absolute; + color:#333; + background-color:#FDFFB4; + font-family:arial,helvetica,verdana,sans-serif; + padding:2px; + border:1px solid #FCC90D; + font:100% sans-serif; + width:auto; +} + +* html body.masked select { + visibility:hidden; +} + +* html div.panel-container select { + visibility:inherit; +} + +* html div.drag select { + visibility:hidden; +} + +* html div.hide-select select { + visibility:hidden; +} + +.mask { + z-index:0; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); + background-color:#CCC; +} + +.hide-scrollbars * { + overflow:hidden; +} + +.hide-scrollbars textarea, .hide-scrollbars select { + overflow:hidden; + display:none; +} + +.show-scrollbars textarea, .show-scrollbars select { + overflow:visible; +} + +.panel-container { + position:absolute; + background-color:transparent; + z-index:6; + visibility:hidden; + overflow:visible; + width:auto; +} + +.panel-container.matte { + padding:3px; + background-color:#FFF; +} + +.panel-container.matte .underlay { + display:none; +} + +.panel-container.shadow { + padding:0px; + background-color:transparent; +} + +.panel-container.shadow .underlay { + visibility:inherit; + position:absolute; + background-color:#CCC; + top:3px;left:3px; + z-index:0; + width:100%; + height:100%; + -moz-opacity: 0.7; + opacity:.70; + filter:alpha(opacity=70); + zoom:1; +} + +.panel { + visibility:hidden; + border-collapse:separate; + position:relative; + left:0px;top:0px; + font:1em Arial; + background-color:#FFF; + border:1px solid #000; + z-index:1; + overflow:hidden; +} + +.panel .hd { + background-color:#3d77cb; + color:#FFF; + font-size:100%; + line-height:100%; + border:1px solid #FFF; + border-bottom:1px solid #000; + font-weight:bold; + overflow:hidden; + padding:4px; +} + +.panel .bd { + overflow:hidden; + padding:4px; +} + +.panel .bd p { + margin:0 0 1em; +} + +.panel .close { + position:absolute; + top:5px; + right:4px; + z-index:6; + height:12px; + width:12px; + margin:0px; + padding:0px; + background-repeat:no-repeat; + cursor:pointer; + visibility:inherit; +} + +.panel .close.nonsecure { + background-image:url(../../images/yui/container/close12_1.gif); +} + +.panel .close.secure { + background-image:url(../../images/yui/container/close12_1.gif); +} + +.panel .ft { + padding:4px; + overflow:hidden; +} + +.simple-dialog .bd .icon { + background-repeat:no-repeat; + width:16px; + height:16px; + margin-right:10px; + float:left; +} + +.dialog .ft, .simple-dialog .ft { + padding-bottom:5px; + padding-right:5px; + text-align:right; +} + +.dialog form, .simple-dialog form { + margin:0; +} + +.button-group button { + font:100 76% verdana; + text-decoration:none; + background-color: #E4E4E4; + color: #333; + cursor: hand; + vertical-align: middle; + border: 2px solid #797979; + border-top-color:#FFF; + border-left-color:#FFF; + margin:2px; + padding:2px; +} + +.button-group button.default { + font-weight:bold; +} + +.button-group button:hover, .button-group button.hover { + border:2px solid #90A029; + background-color:#EBF09E; + border-top-color:#FFF; + border-left-color:#FFF; +} + +.button-group button:active { + border:2px solid #E4E4E4; + background-color:#BBB; + border-top-color:#333; + border-left-color:#333; +} + diff --git a/frontend/beta/css/yui/fonts.css b/frontend/beta/css/yui/fonts.css new file mode 100644 index 0000000..ea8dd16 --- /dev/null +++ b/frontend/beta/css/yui/fonts.css @@ -0,0 +1,62 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.11.3 +*/ + +/** + * 84.5% for !IE, keywords for IE + * Percents could work for IE, but for backCompat purposes, we are using + keywords. + * x-small is for IE < 6 and IE6 quirks mode. + * + */ +body {font:13px arial,helvetica,clean,sans-serif;*font-size:small;*font:x- +small;} +table {font-size:inherit;font:100%;} + +/** + * 99% for safari; 100% is too large + */ +select, input, textarea {font:99% arial,helvetica,clean,sans-serif;} + +/** + * Bump up !IE to get to 13px equivalent + */ +pre, code {font:115% monospace;*font-size:100%;} + +/** + * Default line-height based on font-size rather than "computed-value" + * see: http://www.w3.org/TR/CSS21/visudet.html#line-height + */ +body * {line-height:1.22em;} + diff --git a/frontend/beta/css/yui/grids.css b/frontend/beta/css/yui/grids.css new file mode 100644 index 0000000..8b64f89 --- /dev/null +++ b/frontend/beta/css/yui/grids.css @@ -0,0 +1,116 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.11.3 +*/ +body { + text-align:center; +} + +#doc { + width:57.69em; + *width:56.3em; /* IE */ + min-width:750px; + margin:auto; + text-align:left; +} + +#hd,#bd {margin-bottom:1em;text-align:left;} +#ft {font-size:77%;font-family:verdana;clear:both;} + +/* rules for main templates */ +.yui-t1 #yui-main .yui-b, .yui-t2 #yui-main .yui-b, .yui-t3 #yui-main .yui-b, +.yui-t4 .yui-b, .yui-t5 .yui-b, .yui-t6 .yui-b {float:right;} +.yui-t1 .yui-b, .yui-t2 .yui-b, .yui-t3 .yui-b, .yui-t4 #yui-main .yui-b, .yui- +t5 #yui-main .yui-b, .yui-t6 #yui-main .yui-b {float:left;} + +/* t1: L160 */ +.yui-t1 #yui-main .yui-b {width:76%;min-width:570px;} +.yui-t1 .yui-b {width:21.33%;min-width:160px;} + +/* t2 & t4: L180 & R180 */ +.yui-t2 #yui-main .yui-b, .yui-t4 #yui-main .yui-b {width:73.4%;min- +width:550px;} +.yui-t2 .yui-b, .yui-t4 .yui-b {width:24%;min-width:180px;} + +/* t3 & t6: L300 & R300 */ +.yui-t3 #yui-main .yui-b, .yui-t6 #yui-main .yui-b {width:57.6%;min- +width:430px;} +.yui-t3 .yui-b, .yui-t6 .yui-b {width:40%;min-width:300px;} + +/* t5: R240 */ +.yui-t5 #yui-main .yui-b {width:65.4%;min-width:490px;} +.yui-t5 .yui-b {width:32%;min-width:240px;} + +/* t7: 750 */ + + + +/* grid-generic rules for all templates */ + +/* all modules and grids nested in a grid get floated */ +.yui-g .yui-u, .yui-g .yui-g, .yui-ge .yui-u, .yui-gf .yui-u { + float:right; + display:inline; /* IE */ +} + +/* float left and kill margin on first for added flex */ +.yui-g .first, .yui-gd .first, .yui-ge .first, .yui-gf .first {float:left; } + +/* 2 col */ +.yui-g .yui-u, .yui-g .yui-g {width:49.1%;} +.yui-g .yui-g .yui-u {width:48.1%;} /* smaller for nested to preserve margins */ + +/* 3 col */ +.yui-gb .yui-u, .yui-gc .yui-u, .yui-gd .yui-u { + float:left; /* need to reverse the order for 3 */ + margin-left:2%; *margin-left:1.895%; + width:32%; +} + +.yui-gb .first, .yui-gc .first, .yui-gd .first {margin-left:0;} + +/* colspan 2 */ +.yui-gc .first, .yui-gd .yui-u {width:66%;} +.yui-gd .first {width:32%;} + +/* colspan 3 */ +.yui-ge .yui-u {width:24%;} +.yui-ge .first, .yui-gf .yui-u {width:74.2%;} +.yui-gf .first {width:24%;} +.yui-ge .first {width:74.2%;} + +/* self clear floated parent containers */ +#bd:after, .yui-g:after, .yui-gb:after, .yui-gc:after, .yui-gd:after, .yui- +ge:after, .yui-gf:after +{content:".";display:block;height:0;clear:both;visibility:hidden;} +#bd, .yui-g, .yui-gb, .yui-gc, .yui-gd, .yui-ge, .yui-gf {zoom:1;} /* IE */ diff --git a/frontend/beta/css/yui/logger.css b/frontend/beta/css/yui/logger.css new file mode 100644 index 0000000..1a00f44 --- /dev/null +++ b/frontend/beta/css/yui/logger.css @@ -0,0 +1,49 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* Copyright (c) 2006, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.net/yui/license.txt Version: 0.11.3 */ +/* logger default styles */ +/* font size is controlled here: default 77% */ +#yui-log {position:absolute;top:1em;right:1em;font-size:77%;text-align:left;} +/* width is controlled here: default 31em */ +.yui-log {padding:1em;width:31em;background-color:#AAA;border:1px solid black;font-family:monospace;z-index:9000;} +.yui-log p {margin:1px;padding:.1em;} +.yui-log button {font-family:monospace;} +.yui-log .yui-log-hd {margin-top:1em;padding:.5em;background-color:#575757;color:#FFF;} +/* height is controlled here: default 20em*/ +.yui-log .yui-log-bd {width:100%;height:20em;background-color:#FFF;border:1px solid gray;overflow:auto;} +.yui-log .yui-log-ft {margin-top:.5em;margin-bottom:1em;} +.yui-log .yui-log-ft .yui-log-categoryfilters {} +.yui-log .yui-log-ft .yui-log-sourcefilters {width:100%;border-top:1px solid #575757;margin-top:.75em;padding-top:.75em;} +.yui-log .yui-log-btns {position:relative;float:right;bottom:.25em;} +.yui-log .yui-log-filtergrp {margin-right:.5em;} +.yui-log .info {background-color:#A7CC25;} /* A7CC25 green */ +.yui-log .warn {background-color:#F58516;} /* F58516 orange */ +.yui-log .error {background-color:#E32F0B;} /* E32F0B red */ +.yui-log .time {background-color:#A6C9D7;} /* A6C9D7 blue */ +.yui-log .window {background-color:#F2E886;} /* F2E886 tan */ diff --git a/frontend/beta/css/yui/menu.css b/frontend/beta/css/yui/menu.css new file mode 100644 index 0000000..ab3daea --- /dev/null +++ b/frontend/beta/css/yui/menu.css @@ -0,0 +1,328 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.com/yui/license.txt +Version: 0.11.3 +*/ + + + +/* Menu styles */ + +div.yuimenu { + + z-index:1; + visibility:hidden; + background-color:#f6f7ee; + border:solid 1px #c4c4be; + padding:1px; + +} + + +/* MenuBar Styles */ + +div.yuimenubar { + + background-color:#f6f7ee; + +} + +/* + Application of "zoom:1" triggers "haslayout" in IE so that the module's + body clears its floated elements +*/ +div.yuimenubar div.bd { + + zoom:1; + +} + +/* + Clear the module body for other browsers +*/ +div.yuimenubar div.bd:after { + + content:'.'; + display:block; + clear:both; + visibility:hidden; + height:0; + +} + + +/* Matches the group title (H6) inside a Menu or MenuBar instance */ + +div.yuimenu h6, +div.yuimenubar h6 { + + font-size:100%; + font-weight:normal; + margin:0; + border:solid 1px #c4c4be; + color:#b9b9b9; + +} + +div.yuimenubar h6 { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + padding:4px 12px; + border-width:0 1px 0 0; + +} + +div.yuimenu h6 { + + float:none; + display:block; + border-width:1px 0 0 0; + padding:5px 10px 0 10px; + +} + + +/* Matches the UL inside a Menu or MenuBar instance */ + +div.yuimenubar ul { + + list-style-type:none; + margin:0; + padding:0; + +} + +div.yuimenu ul { + + list-style-type:none; + border:solid 1px #c4c4be; + border-width:1px 0 0 0; + margin:0; + padding:10px 0; + +} + + +div.yuimenu ul.first-of-type, +div.yuimenu ul.hastitle, +div.yuimenu h6.first-of-type { + + border-width:0; + +} + + +/* MenuItem and MenuBarItem styles */ + +div.yuimenu li, +div.yuimenubar li { + + font-size:85%; + cursor:pointer; + cursor:hand; + white-space:nowrap; + text-align:left; + +} + +div.yuimenu li.yuimenuitem { + + padding:2px 24px; + +} + +div.yuimenu li li, +div.yuimenubar li li { + + font-size:100%; + +} + + +/* Matches the help text for a menu item */ + +div.yuimenu li em { + + font-style:normal; + margin:0 0 0 40px; + +} + +div.yuimenu li a em { + + margin:0; + +} + +div.yuimenu li a, +div.yuimenubar li a { + + /* + "zoom:1" triggers "haslayout" in IE to ensure that the mouseover and + mouseout events bubble to the parent LI in IE. + */ + zoom:1; + color:#000; + text-decoration:none; + +} + +div.yuimenu li.hassubmenu, +div.yuimenu li.hashelptext { + + text-align:right; + +} + +div.yuimenu li.hassubmenu a.hassubmenu, +div.yuimenu li.hashelptext a.hashelptext { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + text-align:left; + +} + + +/* Matches focused and selected menu items */ + +div.yuimenu li.selected, +div.yuimenubar li.selected { + + background-color:#8c8ad0; + +} + +div.yuimenu li.selected a.selected, +div.yuimenubar li.selected a.selected { + + text-decoration:underline; + +} + +div.yuimenu li.selected a.selected, +div.yuimenu li.selected em.selected, +div.yuimenubar li.selected a.selected { + + color:#fff; + +} + + +/* Matches disabled menu items */ + +div.yuimenu li.disabled, +div.yuimenubar li.disabled { + + cursor:default; + +} + +div.yuimenu li.disabled a.disabled, +div.yuimenu li.disabled em.disabled, +div.yuimenubar li.disabled a.disabled { + + color:#b9b9b9; + cursor:default; + +} + +div.yuimenubar li.yuimenubaritem { + + float:left; + display:inline; /* Prevent margin doubling in IE */ + border-width:0 0 0 1px; + border-style:solid; + border-color:#c4c4be; + padding:4px 24px; + margin:0; + +} + +div.yuimenubar li.yuimenubaritem.first-of-type { + + border-width:0; + +} + + +/* Matches the submenu indicator for menu items */ + +div.yuimenubar li.yuimenubaritem img { + + height:8px; + width:8px; + margin:0 0 0 10px; + vertical-align:middle; + +} + +div.yuimenu li.yuimenuitem img { + + height:8px; + width:8px; + margin:0 -16px 0 10px; + border:0; + + *margin-left:0; + *border-left-width:10px; + *border-style:solid; + *border-color:#f6f7ee; + +} + +div.yuimenu li.yuimenuitem.selected img.selected { + + *border-color:#8c8ad0; + +} + +div.yuimenu li.checked { + + position:relative; + +} + +div.yuimenu li.checked img.checked { + + height:8px; + width:8px; + margin:0; + border:0; + position:absolute; + left:6px; + _left:-16px; /* Underscore hack b/c this is for IE 5.5 and IE 6 only */ + top:.5em; + +} + diff --git a/frontend/beta/css/yui/reset.css b/frontend/beta/css/yui/reset.css new file mode 100644 index 0000000..c72ae7b --- /dev/null +++ b/frontend/beta/css/yui/reset.css @@ -0,0 +1,43 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.11.3 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;} +table{border-collapse:collapse;border-spacing:0;} +fieldset,img{border:0;} +address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;} +ol,ul {list-style:none;} +caption,th {text-align:left;} +h1,h2,h3,h4,h5,h6{font-size:100%;} +q:before,q:after{content:'';} + diff --git a/frontend/beta/css/yui/tree.css b/frontend/beta/css/yui/tree.css new file mode 100644 index 0000000..8f537ac --- /dev/null +++ b/frontend/beta/css/yui/tree.css @@ -0,0 +1,132 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.com/yui/license.txt +Version: 0.11.3 +*/ + +/* first or middle sibling, no children */ +.ygtvtn { + width:16px; height:22px; + background: url(../../images/yui/treeview/tn.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable */ +.ygtvtm { + width:16px; height:22px; + cursor:pointer ; + background: url(../../images/yui/treeview/tm.gif) 0 0 no-repeat; +} + +/* first or middle sibling, collapsable, hover */ +.ygtvtmh { + width:16px; height:22px; + cursor:pointer ; + background: url(../../images/yui/treeview/tmh.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable */ +.ygtvtp { + width:16px; height:22px; + cursor:pointer ; + background: url(../../images/yui/treeview/tp.gif) 0 0 no-repeat; +} + +/* first or middle sibling, expandable, hover */ +.ygtvtph { + width:16px; height:22px; + cursor:pointer ; + background: url(../../images/yui/treeview/tph.gif) 0 0 no-repeat; +} + +/* last sibling, no children */ +.ygtvln { + width:16px; height:22px; + background: url(../../images/yui/treeview/ln.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable */ +.ygtvlm { + width:16px; height:22px; + cursor:pointer ; + background: url(../../images/yui/treeview/lm.gif) 0 0 no-repeat; +} + +/* Last sibling, collapsable, hover */ +.ygtvlmh { + width:16px; height:22px; + cursor:pointer ; + background: url(../../images/yui/treeview/lmh.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable */ +.ygtvlp { + width:16px; height:22px; + cursor:pointer ; + background: url(../../images/yui/treeview/lp.gif) 0 0 no-repeat; +} + +/* Last sibling, expandable, hover */ +.ygtvlph { + width:16px; height:22px; cursor:pointer ; + background: url(../../images/yui/treeview/lph.gif) 0 0 no-repeat; +} + +/* Loading icon */ +.ygtvloading { + width:16px; height:22px; + background: url(../../images/yui/treeview/loading.gif) 0 0 no-repeat; +} + +/* the style for the empty cells that are used for rendering the depth + * of the node */ +.ygtvdepthcell { + width:16px; height:22px; + background: url(../../images/yui/treeview/vline.gif) 0 0 no-repeat; +} + +.ygtvblankdepthcell { width:16px; height:22px; } + +/* the style of the div around each node */ +.ygtvitem { } + +/* the style of the div around each node's collection of children */ +.ygtvchildren { } +* html .ygtvchildren { height:2%; } + +/* the style of the text label in ygTextNode */ +.ygtvlabel, .ygtvlabel:link, .ygtvlabel:visited, .ygtvlabel:hover { + margin-left:2px; + text-decoration: none; +} + +.ygtvspacer { height: 10px; width: 10px; margin: 2px; } + diff --git a/frontend/beta/html/index_template.html b/frontend/beta/html/index_template.html new file mode 100644 index 0000000..9862518 --- /dev/null +++ b/frontend/beta/html/index_template.html @@ -0,0 +1,100 @@ + + + @page.title@ + + + +@css@ + + + + + + + + + +@js_DEBUG@ + + + +
      + + +
      +

      loading ...

      + +@js_INSTALL@ + + + +
      +

      Attention!

      +

      If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.

      +

      Javascript is required to access Clipperz.

      +
      Please enable scripting or upgrade your browser.
      +
      +
      + + +
      +
      +
      + +
      + + + diff --git a/frontend/beta/images/cardBlockLowerBorder.gif b/frontend/beta/images/cardBlockLowerBorder.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/cardBlockLowerRoundedCorner.gif b/frontend/beta/images/cardBlockLowerRoundedCorner.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/cardFiltersSprite.gif b/frontend/beta/images/cardFiltersSprite.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/cardsBlockRoundCorners.gif b/frontend/beta/images/cardsBlockRoundCorners.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/btn-sprite.gif b/frontend/beta/images/clipperz/basic-dialog/btn-sprite.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/close.gif b/frontend/beta/images/clipperz/basic-dialog/close.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/close.png b/frontend/beta/images/clipperz/basic-dialog/close.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/close_over.gif b/frontend/beta/images/clipperz/basic-dialog/close_over.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/e-handle.gif b/frontend/beta/images/clipperz/basic-dialog/e-handle.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/hd-sprite.gif b/frontend/beta/images/clipperz/basic-dialog/hd-sprite.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/progress.gif b/frontend/beta/images/clipperz/basic-dialog/progress.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/progress2.gif b/frontend/beta/images/clipperz/basic-dialog/progress2.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/s-handle.gif b/frontend/beta/images/clipperz/basic-dialog/s-handle.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/clipperz/basic-dialog/se-handle.gif b/frontend/beta/images/clipperz/basic-dialog/se-handle.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/default/basic-dialog/btn-sprite.gif b/frontend/beta/images/default/basic-dialog/btn-sprite.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/default/basic-dialog/close.gif b/frontend/beta/images/default/basic-dialog/close.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/default/basic-dialog/e-handle.gif b/frontend/beta/images/default/basic-dialog/e-handle.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/default/basic-dialog/hd-sprite.gif b/frontend/beta/images/default/basic-dialog/hd-sprite.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/default/basic-dialog/progress.gif b/frontend/beta/images/default/basic-dialog/progress.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/default/basic-dialog/progress2.gif b/frontend/beta/images/default/basic-dialog/progress2.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/default/basic-dialog/s-handle.gif b/frontend/beta/images/default/basic-dialog/s-handle.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/default/basic-dialog/se-handle.gif b/frontend/beta/images/default/basic-dialog/se-handle.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/directLogin/toggle.png b/frontend/beta/images/directLogin/toggle.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/directLoginBox.png b/frontend/beta/images/directLoginBox.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/entropyBackground.gif b/frontend/beta/images/entropyBackground.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/exportLogo.png b/frontend/beta/images/exportLogo.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/favicon.ico b/frontend/beta/images/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/flags/br.png b/frontend/beta/images/flags/br.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/flags/cn.png b/frontend/beta/images/flags/cn.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/flags/de.png b/frontend/beta/images/flags/de.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/flags/en.png b/frontend/beta/images/flags/en.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/flags/es.png b/frontend/beta/images/flags/es.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/flags/it.png b/frontend/beta/images/flags/it.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/flags/jp.png b/frontend/beta/images/flags/jp.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/flags/ru.png b/frontend/beta/images/flags/ru.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/grippie.png b/frontend/beta/images/grippie.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/importActiveStepsSeparator.png b/frontend/beta/images/importActiveStepsSeparator.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/importStepsBackground.png b/frontend/beta/images/importStepsBackground.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/importStepsLabelsBackground.png b/frontend/beta/images/importStepsLabelsBackground.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/importStepsLeftLabelsBackground.png b/frontend/beta/images/importStepsLeftLabelsBackground.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/importStepsSeparator.png b/frontend/beta/images/importStepsSeparator.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/languageBox.png b/frontend/beta/images/languageBox.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/loginFormBox.png b/frontend/beta/images/loginFormBox.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/loginInfoBackground.png b/frontend/beta/images/loginInfoBackground.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/loginInfoInnerBackground.png b/frontend/beta/images/loginInfoInnerBackground.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/logo.gif b/frontend/beta/images/logo.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/menubarSprite.gif b/frontend/beta/images/menubarSprite.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/newRecordPanelBackground.gif b/frontend/beta/images/newRecordPanelBackground.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/newRecordPanelBackground.png b/frontend/beta/images/newRecordPanelBackground.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/passwordAssistant.png b/frontend/beta/images/passwordAssistant.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/read-only.gif b/frontend/beta/images/read-only.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/read-only.png b/frontend/beta/images/read-only.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/read-only_background.png b/frontend/beta/images/read-only_background.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/recordFilterBackground.png b/frontend/beta/images/recordFilterBackground.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/rss.gif b/frontend/beta/images/rss.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/scrambledValue.gif b/frontend/beta/images/scrambledValue.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/scrambledValue.png b/frontend/beta/images/scrambledValue.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/smiles.gif b/frontend/beta/images/smiles.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/smiles_big.gif b/frontend/beta/images/smiles_big.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/smiles_small.gif b/frontend/beta/images/smiles_small.gif new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/images/test-database.png b/frontend/beta/images/test-database.png new file mode 100644 index 0000000..e69de29 diff --git a/frontend/beta/js/Bookmarklet.js b/frontend/beta/js/Bookmarklet.js new file mode 100644 index 0000000..b8a0c0e --- /dev/null +++ b/frontend/beta/js/Bookmarklet.js @@ -0,0 +1,400 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +_cble = null; + +//----------------------------------------------------------------------------- + +isLoginForm = function(aForm) { + var inputFields; + var passwordFieldsFound; + var i,c; + +//console.log('is login form: ' + aForm.name + ' (' + aForm.id + ')'); + passwordFieldsFound = 0; + inputFields = aForm.elements; + c = inputFields.length; + for (i=0; i
    + * + * @return {CustomEvent} the custom event + * + */ + createEvent: function(p_type, p_config) { + + this.__yui_events = this.__yui_events || {}; + var opts = p_config || {}; + var events = this.__yui_events; + + if (events[p_type]) { + } else { + + var scope = opts.scope || this; + var silent = opts.silent || null; + + var ce = new YAHOO.util.CustomEvent(p_type, scope, silent, + YAHOO.util.CustomEvent.FLAT); + events[p_type] = ce; + + if (opts.onSubscribeCallback) { + ce.subscribeEvent.subscribe(opts.onSubscribeCallback); + } + + this.__yui_subscribers = this.__yui_subscribers || {}; + var qs = this.__yui_subscribers[p_type]; + + if (qs) { + for (var i=0; i + *
  • The first argument fire() was executed with
  • + *
  • The custom object (if any) that was passed into the subscribe() + * method
  • + *
+ * @method fireEvent + * @param p_type {string} the type, or name of the event + * @param arguments {Object*} an arbitrary set of parameters to pass to + * the handler. + * @return {boolean} the return value from CustomEvent.fire, or null if + * the custom event does not exist. + */ + fireEvent: function(p_type, arg1, arg2, etc) { + + this.__yui_events = this.__yui_events || {}; + var ce = this.__yui_events[p_type]; + + if (ce) { + var args = []; + for (var i=1; i", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + "

", + sourceAndDetail, + ":

", + msg, + "

"] : + + ["

", label, " ", + totalTime, "ms (+", elapsedTime, ") ", + localTime, ": ", + sourceAndDetail, ": ", + msg,"

"]; + + return output.join(""); +}; + +/** + * Converts input chars "<", ">", and "&" to HTML entities. + * + * @method html2Text + * @param sHtml {String} String to convert. + * @private + */ +YAHOO.widget.LogReader.prototype.html2Text = function(sHtml) { + if(sHtml) { + sHtml += ""; + return sHtml.replace(/&/g, "&").replace(//g, ">"); + } + return ""; +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class member to index multiple log reader instances. + * + * @property _memberName + * @static + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.LogReader._index = 0; + +/** + * Name of LogReader instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.LogReader.prototype._sName = null; + +/** + * A class member shared by all log readers if a container needs to be + * created during instantiation. Will be null if a container element never needs to + * be created on the fly, such as when the implementer passes in their own element. + * + * @property _elDefaultContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader._elDefaultContainer = null; + +/** + * Buffer of log message objects for batch output. + * + * @property _buffer + * @type Object[] + * @private + */ +YAHOO.widget.LogReader.prototype._buffer = null; + +/** + * Number of log messages output to console. + * + * @property _consoleMsgCount + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.LogReader.prototype._consoleMsgCount = 0; + +/** + * Date of last output log message. + * + * @property _lastTime + * @type Date + * @private + */ +YAHOO.widget.LogReader.prototype._lastTime = null; + +/** + * Batched output timeout ID. + * + * @property _timeout + * @type Number + * @private + */ +YAHOO.widget.LogReader.prototype._timeout = null; + +/** + * Array of filters for log message categories. + * + * @property _categoryFilters + * @type String[] + * @private + */ +YAHOO.widget.LogReader.prototype._categoryFilters = null; + +/** + * Array of filters for log message sources. + * + * @property _sourceFilters + * @type String[] + * @private + */ +YAHOO.widget.LogReader.prototype._sourceFilters = null; + +/** + * Log reader container element. + * + * @property _elContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elContainer = null; + +/** + * Log reader header element. + * + * @property _elHd + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elHd = null; + +/** + * Log reader collapse element. + * + * @property _elCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCollapse = null; + +/** + * Log reader collapse button element. + * + * @property _btnCollapse + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnCollapse = null; + +/** + * Log reader title header element. + * + * @property _title + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._title = null; + +/** + * Log reader console element. + * + * @property _elConsole + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elConsole = null; + +/** + * Log reader footer element. + * + * @property _elFt + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elFt = null; + +/** + * Log reader buttons container element. + * + * @property _elBtns + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elBtns = null; + +/** + * Container element for log reader category filter checkboxes. + * + * @property _elCategoryFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elCategoryFilters = null; + +/** + * Container element for log reader source filter checkboxes. + * + * @property _elSourceFilters + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._elSourceFilters = null; + +/** + * Log reader pause button element. + * + * @property _btnPause + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnPause = null; + +/** + * Clear button element. + * + * @property _btnClear + * @type HTMLElement + * @private + */ +YAHOO.widget.LogReader.prototype._btnClear = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Creates the UI for a category filter in the log reader footer element. + * + * @method _createCategoryCheckbox + * @param sCategory {String} Category name. + * @private + */ +YAHOO.widget.LogReader.prototype._createCategoryCheckbox = function(sCategory) { + var oSelf = this; + + if(this._elFt) { + var elParent = this._elCategoryFilters; + var filters = this._categoryFilters; + + var elFilter = elParent.appendChild(document.createElement("span")); + elFilter.className = "yui-log-filtergrp"; + // Append el at the end so IE 5.5 can set "type" attribute + // and THEN set checked property + var chkCategory = document.createElement("input"); + chkCategory.id = "yui-log-filter-" + sCategory + this._sName; + chkCategory.className = "yui-log-filter-" + sCategory; + chkCategory.type = "checkbox"; + chkCategory.category = sCategory; + chkCategory = elFilter.appendChild(chkCategory); + chkCategory.checked = true; + + // Add this checked filter to the internal array of filters + filters.push(sCategory); + // Subscribe to the click event + YAHOO.util.Event.addListener(chkCategory,'click',oSelf._onCheckCategory,oSelf); + + // Create and class the text label + var lblCategory = elFilter.appendChild(document.createElement("label")); + lblCategory.htmlFor = chkCategory.id; + lblCategory.className = sCategory; + lblCategory.innerHTML = sCategory; + } +}; + +/** + * Creates a checkbox in the log reader footer element to filter by source. + * + * @method _createSourceCheckbox + * @param sSource {String} Source name. + * @private + */ +YAHOO.widget.LogReader.prototype._createSourceCheckbox = function(sSource) { + var oSelf = this; + + if(this._elFt) { + var elParent = this._elSourceFilters; + var filters = this._sourceFilters; + + var elFilter = elParent.appendChild(document.createElement("span")); + elFilter.className = "yui-log-filtergrp"; + + // Append el at the end so IE 5.5 can set "type" attribute + // and THEN set checked property + var chkSource = document.createElement("input"); + chkSource.id = "yui-log-filter" + sSource + this._sName; + chkSource.className = "yui-log-filter" + sSource; + chkSource.type = "checkbox"; + chkSource.source = sSource; + chkSource = elFilter.appendChild(chkSource); + chkSource.checked = true; + + // Add this checked filter to the internal array of filters + filters.push(sSource); + // Subscribe to the click event + YAHOO.util.Event.addListener(chkSource,'click',oSelf._onCheckSource,oSelf); + + // Create and class the text label + var lblSource = elFilter.appendChild(document.createElement("label")); + lblSource.htmlFor = chkSource.id; + lblSource.className = sSource; + lblSource.innerHTML = sSource; + } +}; + +/** + * Reprints all log messages in the stack through filters. + * + * @method _filterLogs + * @private + */ +YAHOO.widget.LogReader.prototype._filterLogs = function() { + // Reprint stack with new filters + if (this._elConsole !== null) { + this._clearConsole(); + this._printToConsole(YAHOO.widget.Logger.getStack()); + } +}; + +/** + * Clears all outputted log messages from the console and resets the time of the + * last output log message. + * + * @method _clearConsole + * @private + */ +YAHOO.widget.LogReader.prototype._clearConsole = function() { + // Clear the buffer of any pending messages + this._timeout = null; + this._buffer = []; + this._consoleMsgCount = 0; + + // Reset the rolling timer + this._lastTime = YAHOO.widget.Logger.getStartTime(); + + var elConsole = this._elConsole; + while(elConsole.hasChildNodes()) { + elConsole.removeChild(elConsole.firstChild); + } +}; + +/** + * Sends buffer of log messages to output and clears buffer. + * + * @method _printBuffer + * @private + */ +YAHOO.widget.LogReader.prototype._printBuffer = function() { + this._timeout = null; + + if(this._elConsole !== null) { + var thresholdMax = this.thresholdMax; + thresholdMax = (thresholdMax && !isNaN(thresholdMax)) ? thresholdMax : 500; + if(this._consoleMsgCount < thresholdMax) { + var entries = []; + for (var i=0; i this.thresholdMax)) { + thresholdMin = 0; + } + var entriesStartIndex = (entriesLen > thresholdMin) ? (entriesLen - thresholdMin) : 0; + + // Iterate through all log entries + var sourceFiltersLen = this._sourceFilters.length; + var categoryFiltersLen = this._categoryFilters.length; + for(var i=entriesStartIndex; i tag instead of
 tag (for wrapping)

+            var container = (this.verboseOutput) ? "CODE" : "PRE";

+            var oNewElement = (this.newestOnTop) ?

+                this._elConsole.insertBefore(

+                    document.createElement(container),this._elConsole.firstChild):

+                this._elConsole.appendChild(document.createElement(container));

+

+            oNewElement.innerHTML = output;

+            this._consoleMsgCount++;

+            this._lastTime = entry.time.getTime();

+        }

+    }

+};

+

+/////////////////////////////////////////////////////////////////////////////

+//

+// Private event handlers

+//

+/////////////////////////////////////////////////////////////////////////////

+

+/**

+ * Handles Logger's categoryCreateEvent.

+ *

+ * @method _onCategoryCreate

+ * @param sType {String} The event.

+ * @param aArgs {Object[]} Data passed from event firer.

+ * @param oSelf {Object} The LogReader instance.

+ * @private

+ */

+YAHOO.widget.LogReader.prototype._onCategoryCreate = function(sType, aArgs, oSelf) {

+    var category = aArgs[0];

+    if(oSelf._elFt) {

+        oSelf._createCategoryCheckbox(category);

+    }

+};

+

+/**

+ * Handles Logger's sourceCreateEvent.

+ *

+ * @method _onSourceCreate

+ * @param sType {String} The event.

+ * @param aArgs {Object[]} Data passed from event firer.

+ * @param oSelf {Object} The LogReader instance.

+ * @private

+ */

+YAHOO.widget.LogReader.prototype._onSourceCreate = function(sType, aArgs, oSelf) {

+    var source = aArgs[0];

+    if(oSelf._elFt) {

+        oSelf._createSourceCheckbox(source);

+    }

+};

+

+/**

+ * Handles check events on the category filter checkboxes.

+ *

+ * @method _onCheckCategory

+ * @param v {HTMLEvent} The click event.

+ * @param oSelf {Object} The LogReader instance.

+ * @private

+ */

+YAHOO.widget.LogReader.prototype._onCheckCategory = function(v, oSelf) {

+    var newFilter = this.category;

+    var filtersArray = oSelf._categoryFilters;

+

+    if(!this.checked) { // Remove category from filters

+        for(var i=0; i 0) {

+                // Substring until first space

+                sClass = sSource.substring(0,spaceIndex);

+                // The rest of the source

+                sDetail = sSource.substring(spaceIndex,sSource.length);

+            }

+            else {

+                sClass = sSource;

+            }

+            if(this._isNewSource(sClass)) {

+                this._createNewSource(sClass);

+            }

+        }

+

+        var timestamp = new Date();

+        var logEntry = new YAHOO.widget.LogMsg({

+            msg: sMsg,

+            time: timestamp,

+            category: sCategory,

+            source: sClass,

+            sourceDetail: sDetail

+        });

+

+        var stack = this._stack;

+        var maxStackEntries = this.maxStackEntries;

+        if(maxStackEntries && !isNaN(maxStackEntries) &&

+            (stack.length >= maxStackEntries)) {

+            stack.shift();

+        }

+        stack.push(logEntry);

+        this.newLogEvent.fire(logEntry);

+

+        if(this._browserConsoleEnabled) {

+            this._printToBrowserConsole(logEntry);

+        }

+        return true;

+    }

+    else {

+        return false;

+    }

+};

+

+/**

+ * Resets internal stack and startTime, enables Logger, and fires logResetEvent.

+ *

+ * @method reset

+ */

+YAHOO.widget.Logger.reset = function() {

+    this._stack = [];

+    this._startTime = new Date().getTime();

+    this.loggerEnabled = true;

+    this.log("Logger reset");

+    this.logResetEvent.fire();

+};

+

+/**

+ * Public accessor to internal stack of log message objects.

+ *

+ * @method getStack

+ * @return {Object[]} Array of log message objects.

+ */

+YAHOO.widget.Logger.getStack = function() {

+    return this._stack;

+};

+

+/**

+ * Public accessor to internal start time.

+ *

+ * @method getStartTime

+ * @return {Date} Internal date of when Logger singleton was initialized.

+ */

+YAHOO.widget.Logger.getStartTime = function() {

+    return this._startTime;

+};

+

+/**

+ * Disables output to the browser's global console.log() function, which is used

+ * by the Firebug extension to Firefox as well as Safari.

+ *

+ * @method disableBrowserConsole

+ */

+YAHOO.widget.Logger.disableBrowserConsole = function() {

+    YAHOO.log("Logger output to the function console.log() has been disabled.");

+    this._browserConsoleEnabled = false;

+};

+

+/**

+ * Enables output to the browser's global console.log() function, which is used

+ * by the Firebug extension to Firefox as well as Safari.

+ *

+ * @method enableBrowserConsole

+ */

+YAHOO.widget.Logger.enableBrowserConsole = function() {

+    this._browserConsoleEnabled = true;

+    YAHOO.log("Logger output to the function console.log() has been enabled.");

+};

+

+/////////////////////////////////////////////////////////////////////////////

+//

+// Public events

+//

+/////////////////////////////////////////////////////////////////////////////

+

+ /**

+ * Fired when a new category has been created.

+ *

+ * @event categoryCreateEvent

+ * @param sCategory {String} Category name.

+ */

+YAHOO.widget.Logger.categoryCreateEvent =

+    new YAHOO.util.CustomEvent("categoryCreate", this, true);

+

+ /**

+ * Fired when a new source has been named.

+ *

+ * @event sourceCreateEvent

+ * @param sSource {String} Source name.

+ */

+YAHOO.widget.Logger.sourceCreateEvent =

+    new YAHOO.util.CustomEvent("sourceCreate", this, true);

+

+ /**

+ * Fired when a new log message has been created.

+ *

+ * @event newLogEvent

+ * @param sMsg {String} Log message.

+ */

+YAHOO.widget.Logger.newLogEvent = new YAHOO.util.CustomEvent("newLog", this, true);

+

+/**

+ * Fired when the Logger has been reset has been created.

+ *

+ * @event logResetEvent

+ */

+YAHOO.widget.Logger.logResetEvent = new YAHOO.util.CustomEvent("logReset", this, true);

+

+/////////////////////////////////////////////////////////////////////////////

+//

+// Private methods

+//

+/////////////////////////////////////////////////////////////////////////////

+

+/**

+ * Creates a new category of log messages and fires categoryCreateEvent.

+ *

+ * @method _createNewCategory

+ * @param sCategory {String} Category name.

+ * @private

+ */

+YAHOO.widget.Logger._createNewCategory = function(sCategory) {

+    this.categories.push(sCategory);

+    this.categoryCreateEvent.fire(sCategory);

+};

+

+/**

+ * Checks to see if a category has already been created.

+ *

+ * @method _isNewCategory

+ * @param sCategory {String} Category name.

+ * @return {Boolean} Returns true if category is unknown, else returns false.

+ * @private

+ */

+YAHOO.widget.Logger._isNewCategory = function(sCategory) {

+    for(var i=0; i < this.categories.length; i++) {

+        if(sCategory == this.categories[i]) {

+            return false;

+        }

+    }

+    return true;

+};

+

+/**

+ * Creates a new source of log messages and fires sourceCreateEvent.

+ *

+ * @method _createNewSource

+ * @param sSource {String} Source name.

+ * @private

+ */

+YAHOO.widget.Logger._createNewSource = function(sSource) {

+    this.sources.push(sSource);

+    this.sourceCreateEvent.fire(sSource);

+};

+

+/**

+ * Checks to see if a source already exists.

+ *

+ * @method _isNewSource

+ * @param sSource {String} Source name.

+ * @return {Boolean} Returns true if source is unknown, else returns false.

+ * @private

+ */

+YAHOO.widget.Logger._isNewSource = function(sSource) {

+    if(sSource) {

+        for(var i=0; i < this.sources.length; i++) {

+            if(sSource == this.sources[i]) {

+                return false;

+            }

+        }

+        return true;

+    }

+};

+

+/**

+ * Outputs a log message to global console.log() function.

+ *

+ * @method _printToBrowserConsole

+ * @param oEntry {Object} Log entry object.

+ * @private

+ */

+YAHOO.widget.Logger._printToBrowserConsole = function(oEntry) {

+    if(window.console && console.log) {

+        var category = oEntry.category;

+        var label = oEntry.category.substring(0,4).toUpperCase();

+

+        var time = oEntry.time;

+        if (time.toLocaleTimeString) {

+            var localTime  = time.toLocaleTimeString();

+        }

+        else {

+            localTime = time.toString();

+        }

+

+        var msecs = time.getTime();

+        var elapsedTime = (YAHOO.widget.Logger._lastTime) ?

+            (msecs - YAHOO.widget.Logger._lastTime) : 0;

+        YAHOO.widget.Logger._lastTime = msecs;

+

+        var output =

+            localTime + " (" +

+            elapsedTime + "ms): " +

+            oEntry.source + ": " +

+            oEntry.msg;

+

+        console.log(output);

+    }

+};

+

+/////////////////////////////////////////////////////////////////////////////

+//

+// Private event handlers

+//

+/////////////////////////////////////////////////////////////////////////////

+

+/**

+ * Handles logging of messages due to window error events.

+ *

+ * @method _onWindowError

+ * @param sMsg {String} The error message.

+ * @param sUrl {String} URL of the error.

+ * @param sLine {String} Line number of the error.

+ * @private

+ */

+YAHOO.widget.Logger._onWindowError = function(sMsg,sUrl,sLine) {

+    // Logger is not in scope of this event handler

+    try {

+        YAHOO.widget.Logger.log(sMsg+' ('+sUrl+', line '+sLine+')', "window");

+        if(YAHOO.widget.Logger._origOnWindowError) {

+            YAHOO.widget.Logger._origOnWindowError();

+        }

+    }

+    catch(e) {

+        return false;

+    }

+};

+

+/////////////////////////////////////////////////////////////////////////////

+//

+// Enable handling of native JavaScript errors

+// NB: Not all browsers support the window.onerror event

+//

+/////////////////////////////////////////////////////////////////////////////

+

+if(window.onerror) {

+    // Save any previously defined handler to call

+    YAHOO.widget.Logger._origOnWindowError = window.onerror;

+}

+window.onerror = YAHOO.widget.Logger._onWindowError;

+

+/////////////////////////////////////////////////////////////////////////////

+//

+// First log

+//

+/////////////////////////////////////////////////////////////////////////////

+

+YAHOO.widget.Logger.log("Logger initialized");

+

diff --git a/frontend/beta/js/YUI/menu.js b/frontend/beta/js/YUI/menu.js
new file mode 100644
index 0000000..50eb0cf
--- /dev/null
+++ b/frontend/beta/js/YUI/menu.js
@@ -0,0 +1,6780 @@
+/*
+Copyright (c) 2006, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.txt
+version: 0.12.0
+*/
+
+/**
+* @module menu
+* @description 

The Menu Library features a collection of widgets that make +* it easy to add menus to your website or web application. With the Menu +* Library you can create website fly-out menus, customized context menus, or +* application-style menu bars with just a small amount of scripting.

+*
    +*
  • Screen-reader accessibility.
  • +*
  • Keyboard and mouse navigation.
  • +*
  • A rich event model that provides access to all of a menu's +* interesting moments.
  • +*
  • Support for +* Progressive +* Enhancement; Menus can be created from simple, +* semantic markup on the page or purely through JavaScript.
  • +*
+* @title Menu Library +* @namespace YAHOO.widget +* @requires Event, Dom, Container +*/ +(function() { + +var Dom = YAHOO.util.Dom; +var Event = YAHOO.util.Event; + +/** +* Singleton that manages a collection of all menus and menu items. Listens for +* DOM events at the document level and dispatches the events to the +* corresponding menu or menu item. +* +* @namespace YAHOO.widget +* @class MenuManager +* @static +*/ +YAHOO.widget.MenuManager = new function() { + + // Private member variables + + // Flag indicating if the DOM event handlers have been attached + + var m_bInitializedEventHandlers = false; + + // Collection of menus + + var m_oMenus = {}; + + + // Collection of menu items + + var m_oItems = {}; + + // Collection of visible menus + + var m_oVisibleMenus = {}; + + // Logger + + + // Private methods + + /** + * Adds an item to the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be added. + */ + var addItem = function(p_oItem) { + + var sYUIId = Dom.generateId(); + + if(p_oItem && m_oItems[sYUIId] != p_oItem) { + + p_oItem.element.setAttribute("yuiid", sYUIId); + + m_oItems[sYUIId] = p_oItem; + + p_oItem.destroyEvent.subscribe(onItemDestroy, p_oItem); + + + } + + }; + + /** + * Removes an item from the collection of known menu items. + * @private + * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem + * instance to be removed. + */ + var removeItem = function(p_oItem) { + + var sYUIId = p_oItem.element.getAttribute("yuiid"); + + if(sYUIId && m_oItems[sYUIId]) { + + delete m_oItems[sYUIId]; + + + } + + }; + + /** + * Finds the root DIV node of a menu or the root LI node of a menu item. + * @private + * @param {HTMLElement} p_oElement Object specifying + * an HTML element. + */ + var getMenuRootElement = function(p_oElement) { + + var oParentNode; + + if(p_oElement && p_oElement.tagName) { + + switch(p_oElement.tagName.toUpperCase()) { + + case "DIV": + + oParentNode = p_oElement.parentNode; + + // Check if the DIV is the inner "body" node of a menu + + if( + Dom.hasClass(p_oElement, "bd") && + oParentNode && + oParentNode.tagName && + oParentNode.tagName.toUpperCase() == "DIV" + ) { + + return oParentNode; + + } + else { + + return p_oElement; + + } + + break; + + case "LI": + + return p_oElement; + + default: + + oParentNode = p_oElement.parentNode; + + if(oParentNode) { + + return getMenuRootElement(oParentNode); + + } + + break; + + } + + } + + }; + + // Private event handlers + + /** + * Generic, global event handler for all of a menu's DOM-based + * events. This listens for events against the document object. If the + * target of a given event is a member of a menu or menu item's DOM, the + * instance's corresponding Custom Event is fired. + * @private + * @param {Event} p_oEvent Object representing the DOM event object passed + * back by the event utility (YAHOO.util.Event). + */ + var onDOMEvent = function(p_oEvent) { + + // Get the target node of the DOM event + + var oTarget = Event.getTarget(p_oEvent); + + // See if the target of the event was a menu, or a menu item + + var oElement = getMenuRootElement(oTarget); + + var oMenuItem; + var oMenu; + + if(oElement) { + + var sTagName = oElement.tagName.toUpperCase(); + + if(sTagName == "LI") { + + var sYUIId = oElement.getAttribute("yuiid"); + + if(sYUIId) { + + oMenuItem = m_oItems[sYUIId]; + oMenu = oMenuItem.parent; + + } + + } + else if(sTagName == "DIV") { + + if(oElement.id) { + + oMenu = m_oMenus[oElement.id]; + + } + + } + + } + + if(oMenu) { + + // Map of DOM event names to CustomEvent names + + var oEventTypes = { + "click": "clickEvent", + "mousedown": "mouseDownEvent", + "mouseup": "mouseUpEvent", + "mouseover": "mouseOverEvent", + "mouseout": "mouseOutEvent", + "keydown": "keyDownEvent", + "keyup": "keyUpEvent", + "keypress": "keyPressEvent" + }; + + var sCustomEventType = oEventTypes[p_oEvent.type]; + + // Fire the Custom Even that corresponds the current DOM event + + if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) { + + oMenuItem[sCustomEventType].fire(p_oEvent); + + } + + oMenu[sCustomEventType].fire(p_oEvent, oMenuItem); + + } + else if(p_oEvent.type == "mousedown") { + + /* + If the target of the event wasn't a menu, hide all + dynamically positioned menus + */ + + var oActiveItem; + + for(var i in m_oMenus) { + + if(m_oMenus.hasOwnProperty(i)) { + + oMenu = m_oMenus[i]; + + if( + oMenu.cfg.getProperty("clicktohide") && + oMenu.cfg.getProperty("position") == "dynamic" + ) { + + oMenu.hide(); + + } + else { + + oMenu.clearActiveItem(true); + + } + + } + + } + + } + + }; + + /** + * "destroy" event handler for a menu. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + var onMenuDestroy = function(p_sType, p_aArgs, p_oMenu) { + + this.removeMenu(p_oMenu); + + }; + + /** + * "destroy" event handler for a MenuItem instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + var onItemDestroy = function(p_sType, p_aArgs, p_oItem) { + + var sYUIId = p_oItem.element.getAttribute("yuiid"); + + if(sYUIId) { + + delete m_oItems[sYUIId]; + + } + + }; + + /** + * Event handler for when the "visible" configuration property + * of a Menu instance changes. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that + * fired the event. + */ + var onMenuVisibleConfigChange = function(p_sType, p_aArgs, p_oMenu) { + + var bVisible = p_aArgs[0]; + + if(bVisible) { + + m_oVisibleMenus[p_oMenu.id] = p_oMenu; + + + } + else if(m_oVisibleMenus[p_oMenu.id]) { + + delete m_oVisibleMenus[p_oMenu.id]; + + + } + + }; + + /** + * "itemadded" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + var onItemAdded = function(p_sType, p_aArgs) { + + addItem(p_aArgs[0]); + + }; + + + /** + * "itemremoved" event handler for a Menu instance. + * @private + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + */ + var onItemRemoved = function(p_sType, p_aArgs) { + + removeItem(p_aArgs[0]); + + }; + + // Privileged methods + + /** + * @method addMenu + * @description Adds a menu to the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu instance + * to be added. + */ + this.addMenu = function(p_oMenu) { + + if(p_oMenu && p_oMenu.id && !m_oMenus[p_oMenu.id]) { + + m_oMenus[p_oMenu.id] = p_oMenu; + + + if(!m_bInitializedEventHandlers) { + + var oDoc = document; + + Event.addListener(oDoc, "mouseover", onDOMEvent, this, true); + Event.addListener(oDoc, "mouseout", onDOMEvent, this, true); + Event.addListener(oDoc, "mousedown", onDOMEvent, this, true); + Event.addListener(oDoc, "mouseup", onDOMEvent, this, true); + Event.addListener(oDoc, "click", onDOMEvent, this, true); + Event.addListener(oDoc, "keydown", onDOMEvent, this, true); + Event.addListener(oDoc, "keyup", onDOMEvent, this, true); + Event.addListener(oDoc, "keypress", onDOMEvent, this, true); + + m_bInitializedEventHandlers = true; + + + } + + p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, this); + + p_oMenu.cfg.subscribeToConfigEvent( + "visible", + onMenuVisibleConfigChange, + p_oMenu + ); + + p_oMenu.itemAddedEvent.subscribe(onItemAdded); + p_oMenu.itemRemovedEvent.subscribe(onItemRemoved); + + + } + + }; + + /** + * @method removeMenu + * @description Removes a menu from the collection of known menus. + * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu instance + * to be removed. + */ + this.removeMenu = function(p_oMenu) { + + if(p_oMenu && m_oMenus[p_oMenu.id]) { + + delete m_oMenus[p_oMenu.id]; + + + } + + }; + + /** + * @method hideVisible + * @description Hides all visible, dynamically positioned menus. + */ + this.hideVisible = function() { + + var oMenu; + + for(var i in m_oVisibleMenus) { + + if(m_oVisibleMenus.hasOwnProperty(i)) { + + oMenu = m_oVisibleMenus[i]; + + if(oMenu.cfg.getProperty("position") == "dynamic") { + + oMenu.hide(); + + } + + } + + } + + }; + + /** + * @method getMenus + * @description Returns an array of all menus registered with the + * menu manger. + * @return {Array} + */ + this.getMenus = function() { + + return m_oMenus; + + }; + + /** + * @method getMenu + * @description Returns a menu with the specified id. + * @param {String} p_sId String specifying the id of the menu to + * be retrieved. + * @return {YAHOO.widget.Menu} + */ + this.getMenu = function(p_sId) { + + if(m_oMenus[p_sId]) { + + return m_oMenus[p_sId]; + + } + + }; + + + /** + * @method toString + * @description Returns a string representing the menu manager. + * @return {String} + */ + this.toString = function() { + + return ("MenuManager"); + + }; + +}; + +})(); + +(function() { + +var Dom = YAHOO.util.Dom; +var Event = YAHOO.util.Event; + +/** +* The Menu class creates a container that holds a vertical list representing +* a set of options or commands. Menu is the base class for all +* menu containers. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +* @namespace YAHOO.widget +* @class Menu +* @constructor +* @extends YAHOO.widget.Overlay +*/ +YAHOO.widget.Menu = function(p_oElement, p_oConfig) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + + this.lazyLoad = p_oConfig.lazyLoad || p_oConfig.lazyload; + + this.itemData = p_oConfig.itemData || p_oConfig.itemdata; + + } + + YAHOO.widget.Menu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + +YAHOO.extend(YAHOO.widget.Menu, YAHOO.widget.Overlay, { + +// Constants + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* menu's <div> element. +* @default "yuimenu" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenu", + +/** +* @property ITEM_TYPE +* @description Object representing the type of menu item to instantiate and +* add when parsing the child nodes (either <li> element, +* <optgroup> element or <option>) +* of the menu's source HTML element. +* @default YAHOO.widget.MenuItem +* @final +* @type YAHOO.widget.MenuItem +*/ +ITEM_TYPE: null, + +/** +* @property GROUP_TITLE_TAG_NAME +* @description String representing the tagname of the HTML element used to +* title the menu's item groups. +* @default H6 +* @final +* @type String +*/ +GROUP_TITLE_TAG_NAME: "h6", + +// Private properties + +/** +* @property _nHideDelayId +* @description Number representing the time-out setting used to cancel the +* hiding of a menu. +* @default null +* @private +* @type Number +*/ +_nHideDelayId: null, + +/** +* @property _nShowDelayId +* @description Number representing the time-out setting used to cancel the +* showing of a menu. +* @default null +* @private +* @type Number +*/ +_nShowDelayId: null, + +/** +* @property _hideDelayEventHandlersAssigned +* @description Boolean indicating if the "mouseover" and "mouseout" event +* handlers used for hiding the menu via a call to "window.setTimeout" have +* already been assigned. +* @default false +* @private +* @type Boolean +*/ +_hideDelayEventHandlersAssigned: false, + +/** +* @property _bHandledMouseOverEvent +* @description Boolean indicating the current state of the menu's +* "mouseover" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOverEvent: false, + +/** +* @property _bHandledMouseOutEvent +* @description Boolean indicating the current state of the menu's +* "mouseout" event. +* @default false +* @private +* @type Boolean +*/ +_bHandledMouseOutEvent: false, + +/** +* @property _aGroupTitleElements +* @description Array of HTML element used to title groups of menu items. +* @default [] +* @private +* @type Array +*/ +_aGroupTitleElements: null, + +/** +* @property _aItemGroups +* @description Array of menu items. +* @default [] +* @private +* @type Array +*/ +_aItemGroups: null, + +/** +* @property _aListElements +* @description Array of <ul> elements, each of which is +* the parent node for each item's <li> element. +* @default [] +* @private +* @type Array +*/ +_aListElements: null, + +// Public properties + +/** +* @property lazyLoad +* @description Boolean indicating if the menu's "lazy load" feature is +* enabled. If set to "true," initialization and rendering of the menu's +* items will be deferred until the first time it is made visible. This +* property should be set via the constructor using the configuration +* object literal. +* @default false +* @type Boolean +*/ +lazyLoad: false, + +/** +* @property itemData +* @description Array of items to be added to the menu. The array can contain +* strings representing the text for each item to be created, object literals +* representing the menu item configuration properties, or MenuItem instances. +* This property should be set via the constructor using the configuration +* object literal. +* @default null +* @type Array +*/ +itemData: null, + +/** +* @property activeItem +* @description Object reference to the item in the menu that has focus. +* @default null +* @type YAHOO.widget.MenuItem +*/ +activeItem: null, + +/** +* @property parent +* @description Object reference to the menu's parent menu or menu item. +* This property can be set via the constructor using the configuration +* object literal. +* @default null +* @type YAHOO.widget.MenuItem +*/ +parent: null, + +/** +* @property srcElement +* @description Object reference to the HTML element (either +* <select> or <div>) used to +* create the menu. +* @default null +* @type HTMLSelectElement|HTMLDivElement +*/ +srcElement: null, + +// Events + +/** +* @event mouseOverEvent +* @description Fires when the mouse has entered the menu. Passes back +* the DOM Event object as an argument. +*/ +mouseOverEvent: null, + +/** +* @event mouseOutEvent +* @description Fires when the mouse has left the menu. Passes back the DOM +* Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseOutEvent: null, + +/** +* @event mouseDownEvent +* @description Fires when the user mouses down on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseDownEvent: null, + +/** +* @event mouseUpEvent +* @description Fires when the user releases a mouse button while the mouse is +* over the menu. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +mouseUpEvent: null, + +/** +* @event clickEvent +* @description Fires when the user clicks the on the menu. Passes back the +* DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +clickEvent: null, + +/** +* @event keyPressEvent +* @description Fires when the user presses an alphanumeric key when one of the +* menu's items has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyPressEvent: null, + +/** +* @event keyDownEvent +* @description Fires when the user presses a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyDownEvent: null, + +/** +* @event keyUpEvent +* @description Fires when the user releases a key when one of the menu's items +* has focus. Passes back the DOM Event object as an argument. +* @type YAHOO.util.CustomEvent +*/ +keyUpEvent: null, + +/** +* @event itemAddedEvent +* @description Fires when an item is added to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemAddedEvent: null, + +/** +* @event itemRemovedEvent +* @description Fires when an item is removed to the menu. +* @type YAHOO.util.CustomEvent +*/ +itemRemovedEvent: null, + +/** +* @method init +* @description The Menu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source +* for the menu. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu. +* @param {HTMLSelectElement} p_oElement +* Object specifying the <select> element to be used as +* the data source for the menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + this._aItemGroups = []; + this._aListElements = []; + this._aGroupTitleElements = []; + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuItem; + + } + + var oElement; + + if(typeof p_oElement == "string") { + + oElement = document.getElementById(p_oElement); + + } + else if(p_oElement.tagName) { + + oElement = p_oElement; + + } + + if(oElement && oElement.tagName) { + + switch(oElement.tagName.toUpperCase()) { + + case "DIV": + + this.srcElement = oElement; + + if(!oElement.id) { + + oElement.setAttribute("id", Dom.generateId()); + + } + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + + break; + + case "SELECT": + + this.srcElement = oElement; + + + /* + The source element is not something that we can use + outright, so we need to create a new Overlay + + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, Dom.generateId()); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + break; + + } + + } + else { + + /* + Note: we don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.Menu.superclass.init.call(this, p_oElement); + + this.beforeInitEvent.fire(YAHOO.widget.Menu); + + } + + if(this.element) { + + var oEl = this.element; + + Dom.addClass(oEl, this.CSS_CLASS_NAME); + + // Subscribe to Custom Events + + this.initEvent.subscribe(this._onInit, this, true); + this.beforeRenderEvent.subscribe(this._onBeforeRender, this, true); + this.renderEvent.subscribe(this._onRender, this, true); + this.beforeShowEvent.subscribe(this._onBeforeShow, this, true); + this.showEvent.subscribe(this._onShow, this, true); + this.beforeHideEvent.subscribe(this._onBeforeHide, this, true); + this.mouseOverEvent.subscribe(this._onMouseOver, this, true); + this.mouseOutEvent.subscribe(this._onMouseOut, this, true); + this.clickEvent.subscribe(this._onClick, this, true); + this.keyDownEvent.subscribe(this._onKeyDown, this, true); + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + // Register the Menu instance with the MenuManager + + YAHOO.widget.MenuManager.addMenu(this); + + + this.initEvent.fire(YAHOO.widget.Menu); + + } + +}, + +// Private methods + +/** +* @method _initSubTree +* @description Iterates the childNodes of the source element to find nodes +* used to instantiate menu and menu items. +* @private +*/ +_initSubTree: function() { + + var oNode; + + if(this.srcElement.tagName == "DIV") { + + /* + Populate the collection of item groups and item + group titles + */ + + oNode = this.body.firstChild; + + var nGroup = 0; + var sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase(); + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case sGroupTitleTagName: + + this._aGroupTitleElements[nGroup] = oNode; + + break; + + case "UL": + + this._aListElements[nGroup] = oNode; + this._aItemGroups[nGroup] = []; + nGroup++; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + /* + Apply the "first-of-type" class to the first UL to mimic + the "first-of-type" CSS3 psuedo class. + */ + + if(this._aListElements[0]) { + + Dom.addClass(this._aListElements[0], "first-of-type"); + + } + + } + + oNode = null; + + if(this.srcElement.tagName) { + + switch(this.srcElement.tagName.toUpperCase()) { + + case "DIV": + + if(this._aListElements.length > 0) { + + + var i = this._aListElements.length - 1; + + do { + + oNode = this._aListElements[i].firstChild; + + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "LI": + + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ), + i + ); + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + } + while(i--); + + } + + break; + + case "SELECT": + + + oNode = this.srcElement.firstChild; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "OPTGROUP": + case "OPTION": + + + this.addItem( + new this.ITEM_TYPE( + oNode, + { parent: this } + ) + ); + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + break; + + } + + } + +}, + +/** +* @method _getFirstEnabledItem +* @description Returns the first enabled item in the menu. +* @return {YAHOO.widget.MenuItem} +* @private +*/ +_getFirstEnabledItem: function() { + + var nGroups = this._aItemGroups.length; + var oItem; + var aItemGroup; + + for(var i=0; i= aGroup.length); + + if(aGroup[p_nItemIndex]) { + + aGroup.splice(p_nItemIndex, 0, oItem); + + } + else { + + aGroup[p_nItemIndex] = oItem; + + } + + oGroupItem = aGroup[p_nItemIndex]; + + if(oGroupItem) { + + if( + bAppend && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + else { + + + /** + * Returns the next sibling of an item in an array. + * @private + * @param {p_aArray} Array to search. + * @param {p_nStartIndex} Number indicating the index to + * start searching the array. + * @return {Object} + */ + var getNextItemSibling = + + function(p_aArray, p_nStartIndex) { + + return ( + p_aArray[p_nStartIndex] || + getNextItemSibling( + p_aArray, + (p_nStartIndex+1) + ) + ); + + }; + + + var oNextItemSibling = + getNextItemSibling(aGroup, (p_nItemIndex+1)); + + if( + oNextItemSibling && + ( + !oGroupItem.element.parentNode || + oGroupItem.element.parentNode.nodeType == 11 + ) + ) { + + this._aListElements[nGroupIndex].insertBefore( + oGroupItem.element, + oNextItemSibling.element + ); + + } + + } + + + oGroupItem.parent = this; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + this._updateItemProperties(nGroupIndex); + + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + else { + + var nItemIndex = aGroup.length; + + aGroup[nItemIndex] = oItem; + + oGroupItem = aGroup[nItemIndex]; + + + if(oGroupItem) { + + if( + !Dom.isAncestor( + this._aListElements[nGroupIndex], + oGroupItem.element + ) + ) { + + this._aListElements[nGroupIndex].appendChild( + oGroupItem.element + ); + + } + + oGroupItem.element.setAttribute("groupindex", nGroupIndex); + oGroupItem.element.setAttribute("index", nItemIndex); + + oGroupItem.parent = this; + + oGroupItem.index = nItemIndex; + oGroupItem.groupIndex = nGroupIndex; + + this._subscribeToItemEvents(oGroupItem); + + this._configureSubmenu(oGroupItem); + + if(nItemIndex === 0) { + + Dom.addClass(oGroupItem.element, "first-of-type"); + + } + + + + this.itemAddedEvent.fire(oGroupItem); + + return oGroupItem; + + } + + } + + } + +}, + +/** +* @method _removeItemFromGroupByIndex +* @description Removes a menu item from a group by index. Returns the menu +* item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the menu +* item belongs. +* @param {Number} p_nItemIndex Number indicating the index of the menu item +* to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByIndex: function(p_nGroupIndex, p_nItemIndex) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0; + var aGroup = this._getItemGroup(nGroupIndex); + + if(aGroup) { + + var aArray = aGroup.splice(p_nItemIndex, 1); + var oItem = aArray[0]; + + if(oItem) { + + // Update the index and className properties of each member + + this._updateItemProperties(nGroupIndex); + + if(aGroup.length === 0) { + + // Remove the UL + + var oUL = this._aListElements[nGroupIndex]; + + if(this.body && oUL) { + + this.body.removeChild(oUL); + + } + + // Remove the group from the array of items + + this._aItemGroups.splice(nGroupIndex, 1); + + + // Remove the UL from the array of ULs + + this._aListElements.splice(nGroupIndex, 1); + + + /* + Assign the "first-of-type" class to the new first UL + in the collection + */ + + oUL = this._aListElements[0]; + + if(oUL) { + + Dom.addClass(oUL, "first-of-type"); + + } + + } + + + this.itemRemovedEvent.fire(oItem); + + // Return a reference to the item that was removed + + return oItem; + + } + + } + +}, + +/** +* @method _removeItemFromGroupByValue +* @description Removes a menu item from a group by reference. Returns the +* menu item that was removed. +* @private +* @param {Number} p_nGroupIndex Number indicating the group to which the +* menu item belongs. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be removed. +* @return {YAHOO.widget.MenuItem} +*/ +_removeItemFromGroupByValue: function(p_nGroupIndex, p_oItem) { + + var aGroup = this._getItemGroup(p_nGroupIndex); + + if(aGroup) { + + var nItems = aGroup.length; + var nItemIndex = -1; + + if(nItems > 0) { + + var i = nItems-1; + + do { + + if(aGroup[i] == p_oItem) { + + nItemIndex = i; + break; + + } + + } + while(i--); + + if(nItemIndex > -1) { + + return this._removeItemFromGroupByIndex( + p_nGroupIndex, + nItemIndex + ); + + } + + } + + } + +}, + +/** +* @method _updateItemProperties +* @description Updates the "index," "groupindex," and "className" properties +* of the menu items in the specified group. +* @private +* @param {Number} p_nGroupIndex Number indicating the group of items to update. +*/ +_updateItemProperties: function(p_nGroupIndex) { + + var aGroup = this._getItemGroup(p_nGroupIndex); + var nItems = aGroup.length; + + if(nItems > 0) { + + var i = nItems - 1; + var oItem; + var oLI; + + // Update the index and className properties of each member + + do { + + oItem = aGroup[i]; + + if(oItem) { + + oLI = oItem.element; + + oItem.index = i; + oItem.groupIndex = p_nGroupIndex; + + oLI.setAttribute("groupindex", p_nGroupIndex); + oLI.setAttribute("index", i); + + Dom.removeClass(oLI, "first-of-type"); + + } + + } + while(i--); + + if(oLI) { + + Dom.addClass(oLI, "first-of-type"); + + } + + } + +}, + +/** +* @method _createItemGroup +* @description Creates a new menu item group (array) and its associated +* <ul> element. Returns an aray of menu item groups. +* @private +* @param {Number} p_nIndex Number indicating the group to create. +* @return {Array} +*/ +_createItemGroup: function(p_nIndex) { + + if(!this._aItemGroups[p_nIndex]) { + + this._aItemGroups[p_nIndex] = []; + + var oUL = document.createElement("ul"); + + this._aListElements[p_nIndex] = oUL; + + return this._aItemGroups[p_nIndex]; + + } + +}, + +/** +* @method _getItemGroup +* @description Returns the menu item group at the specified index. +* @private +* @param {Number} p_nIndex Number indicating the index of the menu item group +* to be retrieved. +* @return {Array} +*/ +_getItemGroup: function(p_nIndex) { + + var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0); + + return this._aItemGroups[nIndex]; + +}, + +/** +* @method _configureSubmenu +* @description Subscribes the menu item's submenu to its parent menu's events. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance with the submenu to be configured. +*/ +_configureSubmenu: function(p_oItem) { + + var oSubmenu = p_oItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + /* + Listen for configuration changes to the parent menu + so they they can be applied to the submenu. + */ + + this.cfg.configChangedEvent.subscribe( + this._onParentMenuConfigChange, + oSubmenu, + true + ); + + this.renderEvent.subscribe( + this._onParentMenuRender, + oSubmenu, + true + ); + + oSubmenu.beforeShowEvent.subscribe( + this._onSubmenuBeforeShow, + oSubmenu, + true + ); + + oSubmenu.showEvent.subscribe( + this._onSubmenuShow, + oSubmenu, + true + ); + + oSubmenu.hideEvent.subscribe( + this._onSubmenuHide, + oSubmenu, + true + ); + + } + +}, + +/** +* @method _subscribeToItemEvents +* @description Subscribes a menu to a menu item's event. +* @private +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance whose events should be subscribed to. +*/ +_subscribeToItemEvents: function(p_oItem) { + + p_oItem.focusEvent.subscribe(this._onMenuItemFocus, p_oItem, this); + + p_oItem.blurEvent.subscribe(this._onMenuItemBlur, this, true); + + p_oItem.cfg.configChangedEvent.subscribe( + this._onMenuItemConfigChange, + p_oItem, + this + ); + +}, + +/** +* @method _getOffsetWidth +* @description Returns the offset width of the menu's +* <div> element. +* @private +*/ +_getOffsetWidth: function() { + + var oClone = this.element.cloneNode(true); + + Dom.setStyle(oClone, "width", ""); + + document.body.appendChild(oClone); + + var sWidth = oClone.offsetWidth; + + document.body.removeChild(oClone); + + return sWidth; + +}, + +/** +* @method _cancelHideDelay +* @description Cancels the call to "hideMenu." +* @private +*/ +_cancelHideDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nHideDelayId) { + + window.clearTimeout(oRoot._nHideDelayId); + + } + +}, + +/** +* @method _execHideDelay +* @description Hides the menu after the number of milliseconds specified by +* the "hidedelay" configuration property. +* @private +*/ +_execHideDelay: function() { + + this._cancelHideDelay(); + + var oRoot = this.getRoot(); + var me = this; + + var hideMenu = function() { + + if(oRoot.activeItem) { + + oRoot.clearActiveItem(); + + } + + if(oRoot == me && me.cfg.getProperty("position") == "dynamic") { + + me.hide(); + + } + + }; + + oRoot._nHideDelayId = + window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay")); + +}, + +/** +* @method _cancelShowDelay +* @description Cancels the call to the "showMenu." +* @private +*/ +_cancelShowDelay: function() { + + var oRoot = this.getRoot(); + + if(oRoot._nShowDelayId) { + + window.clearTimeout(oRoot._nShowDelayId); + + } + +}, + +/** +* @method _execShowDelay +* @description Shows the menu after the number of milliseconds specified by +* the "showdelay" configuration property have ellapsed. +* @private +* @param {YAHOO.widget.Menu} p_oMenu Object specifying the menu that should +* be made visible. +*/ +_execShowDelay: function(p_oMenu) { + + this._cancelShowDelay(); + + var oRoot = this.getRoot(); + + var showMenu = function() { + + p_oMenu.show(); + + }; + + oRoot._nShowDelayId = + window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay")); + +}, + +// Protected methods + +/** +* @method _onMouseOver +* @description "mouseover" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOver: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + var oItem = p_aArgs[1]; + var oTarget = Event.getTarget(oEvent); + + if( + !this._bHandledMouseOverEvent && + (oTarget == this.element || Dom.isAncestor(this.element, oTarget)) + ) { + + // MENU MOUSEOVER LOGIC HERE + + this.clearActiveItem(); + + this._bHandledMouseOverEvent = true; + this._bHandledMouseOutEvent = false; + + } + + if( + oItem && !oItem.handledMouseOverEvent && + (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget)) + ) { + + var oItemCfg = oItem.cfg; + + // Select and focus the current menu item + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + if(this.cfg.getProperty("autosubmenudisplay")) { + + // Show the submenu this menu item + + var oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(this.cfg.getProperty("showdelay") > 0) { + + this._execShowDelay(oSubmenu); + + } + else { + + oSubmenu.show(); + + } + + } + + } + + oItem.handledMouseOverEvent = true; + oItem.handledMouseOutEvent = false; + + } + +}, + +/** +* @method _onMouseOut +* @description "mouseout" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onMouseOut: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + var oItem = p_aArgs[1]; + var oRelatedTarget = Event.getRelatedTarget(oEvent); + var bMovingToSubmenu = false; + + if(oItem) { + + var oItemCfg = oItem.cfg; + var oSubmenu = oItemCfg.getProperty("submenu"); + + if( + oSubmenu && + ( + oRelatedTarget == oSubmenu.element || + Dom.isAncestor(oSubmenu.element, oRelatedTarget) + ) + ) { + + bMovingToSubmenu = true; + + } + + if( + !oItem.handledMouseOutEvent && + ( + ( + oRelatedTarget != oItem.element && + !Dom.isAncestor(oItem.element, oRelatedTarget) + ) || bMovingToSubmenu + ) + ) { + + if(this.cfg.getProperty("showdelay") > 0) { + + this._cancelShowDelay(); + + } + + if(!bMovingToSubmenu) { + + oItemCfg.setProperty("selected", false); + + } + + if(this.cfg.getProperty("autosubmenudisplay")) { + + if(oSubmenu) { + + if( + !( + oRelatedTarget == oSubmenu.element || + YAHOO.util.Dom.isAncestor( + oSubmenu.element, + oRelatedTarget + ) + ) + ) { + + oSubmenu.hide(); + + } + + } + + } + + oItem.handledMouseOutEvent = true; + oItem.handledMouseOverEvent = false; + + } + + } + + if( + !this._bHandledMouseOutEvent && + ( + ( + oRelatedTarget != this.element && + !Dom.isAncestor(this.element, oRelatedTarget) + ) + || bMovingToSubmenu + ) + ) { + + this._bHandledMouseOutEvent = true; + this._bHandledMouseOverEvent = false; + + } + +}, + +/** +* @method _onClick +* @description "click" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + var oItem = p_aArgs[1]; + var oTarget = Event.getTarget(oEvent); + + if(oItem) { + + var oItemCfg = oItem.cfg; + var oSubmenu = oItemCfg.getProperty("submenu"); + + /* + ACCESSIBILITY FEATURE FOR SCREEN READERS: + Expand/collapse the submenu when the user clicks + on the submenu indicator image. + */ + + if(oTarget == oItem.submenuIndicator && oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + } + else { + + this.clearActiveItem(); + + this.activeItem = oItem; + + oItem.cfg.setProperty("selected", true); + + oSubmenu.show(); + + } + + } + else { + + var sURL = oItemCfg.getProperty("url"); + var bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#"); + var sTarget = oItemCfg.getProperty("target"); + var bHasTarget = (sTarget && sTarget.length > 0); + + /* + Prevent the browser from following links + equal to "#" + */ + + if( + oTarget.tagName.toUpperCase() == "A" && + bCurrentPageURL && !bHasTarget + ) { + + Event.preventDefault(oEvent); + + } + + if( + oTarget.tagName.toUpperCase() != "A" && + !bCurrentPageURL && !bHasTarget + ) { + + /* + Follow the URL of the item regardless of + whether or not the user clicked specifically + on the anchor element. + */ + + document.location = sURL; + + } + + /* + If the item doesn't navigate to a URL and it doesn't have + a submenu, then collapse the menu tree. + */ + + if(bCurrentPageURL && !oSubmenu) { + + var oRoot = this.getRoot(); + + if(oRoot.cfg.getProperty("position") == "static") { + + oRoot.clearActiveItem(); + + } + else { + + oRoot.hide(); + + } + + } + + } + + } + +}, + +/** +* @method _onKeyDown +* @description "keydown" event handler for the menu. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenu) { + + var oEvent = p_aArgs[0]; + var oItem = p_aArgs[1]; + var oSubmenu; + + if(oItem) { + + var oItemCfg = oItem.cfg; + var oParentItem = this.parent; + var oRoot; + var oNextItem; + + switch(oEvent.keyCode) { + + case 38: // Up arrow + case 40: // Down arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + oNextItem = (oEvent.keyCode == 38) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + oNextItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + + case 39: // Right arrow + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(!oItemCfg.getProperty("selected")) { + + oItemCfg.setProperty("selected", true); + + } + + oSubmenu.show(); + + oSubmenu.setInitialSelection(); + + } + else { + + oRoot = this.getRoot(); + + if(oRoot instanceof YAHOO.widget.MenuBar) { + + oNextItem = oRoot.activeItem.getNextEnabledSibling(); + + if(oNextItem) { + + oRoot.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + + } + + + Event.preventDefault(oEvent); + + break; + + + case 37: // Left arrow + + if(oParentItem) { + + var oParentMenu = oParentItem.parent; + + if(oParentMenu instanceof YAHOO.widget.MenuBar) { + + oNextItem = + oParentMenu.activeItem.getPreviousEnabledSibling(); + + if(oNextItem) { + + oParentMenu.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + + } + + oNextItem.focus(); + + } + + } + else { + + this.hide(); + + oParentItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + } + + } + + if(oEvent.keyCode == 27) { // Esc key + + if(this.cfg.getProperty("position") == "dynamic") { + + this.hide(); + + if(this.parent) { + + this.parent.focus(); + + } + + } + else if(this.activeItem) { + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + } + + Event.preventDefault(oEvent); + + } + +}, + +// Private methods + +/** +* @method _onInit +* @description "init" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onInit: function(p_sType, p_aArgs, p_oMenu) { + + if( + ( + (this.parent && !this.lazyLoad) || + (!this.parent && this.cfg.getProperty("position") == "static") || + ( + !this.parent && + !this.lazyLoad && + this.cfg.getProperty("position") == "dynamic" + ) + ) && + this.getItemGroups().length === 0 + ) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + if(this.itemData) { + + this.addItems(this.itemData); + + } + + } + else if(this.lazyLoad) { + + this.cfg.fireQueue(); + + } + +}, + +/** +* @method _onBeforeRender +* @description "beforerender" event handler for the menu. Appends all of the +* <ul>, <li> and their accompanying +* title elements to the body element of the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeRender: function(p_sType, p_aArgs, p_oMenu) { + + var oConfig = this.cfg; + var oEl = this.element; + var nListElements = this._aListElements.length; + + if(nListElements > 0) { + + var i = 0; + var bFirstList = true; + var oUL; + var oGroupTitle; + + do { + + oUL = this._aListElements[i]; + + if(oUL) { + + if(bFirstList) { + + Dom.addClass(oUL, "first-of-type"); + bFirstList = false; + + } + + if(!Dom.isAncestor(oEl, oUL)) { + + this.appendToBody(oUL); + + } + + oGroupTitle = this._aGroupTitleElements[i]; + + if(oGroupTitle) { + + if(!Dom.isAncestor(oEl, oGroupTitle)) { + + oUL.parentNode.insertBefore(oGroupTitle, oUL); + + } + + Dom.addClass(oUL, "hastitle"); + + } + + } + + i++; + + } + while(i < nListElements); + + } + +}, + +/** +* @method _onRender +* @description "render" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onRender: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + var sWidth = + this.element.parentNode.tagName.toUpperCase() == "BODY" ? + this.element.offsetWidth : this._getOffsetWidth(); + + this.cfg.setProperty("width", (sWidth + "px")); + + } + +}, + +/** +* @method _onBeforeShow +* @description "beforeshow" event handler for the menu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +_onBeforeShow: function(p_sType, p_aArgs, p_oMenu) { + + if(this.lazyLoad && this.getItemGroups().length === 0) { + + if(this.srcElement) { + + this._initSubTree(); + + } + + if(this.itemData) { + + if( + this.parent && this.parent.parent && + this.parent.parent.srcElement && + this.parent.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + var nOptions = this.itemData.length; + + for(var n=0; n 0) { + + oConfig.showdelay = nShowDelay; + + } + + var nHideDelay = oParentMenu.cfg.getProperty("hidedelay"); + + if(nHideDelay > 0) { + + oConfig.hidedelay = nHideDelay; + + } + + /* + Only sync the "iframe" configuration property if the parent + menu's "position" configuration is the same. + */ + + if( + this.cfg.getProperty("position") == + oParentMenu.cfg.getProperty("position") + ) { + + oConfig.iframe = oParentMenu.cfg.getProperty("iframe"); + + } + + + p_oSubmenu.cfg.applyConfig(oConfig); + + if(!this.lazyLoad) { + + if(Dom.inDocument(this.element)) { + + this.render(); + + } + else { + + this.render(this.parent.element); + + } + + } + +}, + +/** +* @method _onSubmenuBeforeShow +* @description "beforeshow" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuBeforeShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + var aAlignment = oParent.parent.cfg.getProperty("submenualignment"); + + this.cfg.setProperty( + "context", + [oParent.element, aAlignment[0], aAlignment[1]] + ); + + oParent.submenuIndicator.alt = oParent.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT; + +}, + +/** +* @method _onSubmenuShow +* @description "show" event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuShow: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.alt = oParent.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT; + +}, + +/** +* @method _onSubmenuHide +* @description "hide" Custom Event handler for a submenu. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that +* subscribed to the event. +*/ +_onSubmenuHide: function(p_sType, p_aArgs, p_oSubmenu) { + + var oParent = this.parent; + + oParent.submenuIndicator.alt = oParent.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT; + +}, + +/** +* @method _onMenuItemFocus +* @description "focus" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemFocus: function(p_sType, p_aArgs, p_oItem) { + + this.activeItem = p_oItem; + +}, + +/** +* @method _onMenuItemBlur +* @description "blur" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event +* that was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +*/ +_onMenuItemBlur: function(p_sType, p_aArgs) { + + this.activeItem = null; + +}, + +/** +* @method _onMenuItemConfigChange +* @description "configchange" event handler for the menu's items. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item +* that fired the event. +*/ +_onMenuItemConfigChange: function(p_sType, p_aArgs, p_oItem) { + + var sProperty = p_aArgs[0][0]; + + switch(sProperty) { + + case "submenu": + + var oSubmenu = p_aArgs[0][1]; + + if(oSubmenu) { + + this._configureSubmenu(p_oItem); + + } + + break; + + case "text": + case "helptext": + + /* + A change to an item's "text" or "helptext" + configuration properties requires the width of the parent + menu to be recalculated. + */ + + if(this.element.style.width) { + + var sWidth = this._getOffsetWidth() + "px"; + + Dom.setStyle(this.element, "width", sWidth); + + } + + break; + + } + +}, + +// Public event handlers for configuration properties + +/** +* @method enforceConstraints +* @description The default event handler executed when the moveEvent is fired, +* if the "constraintoviewport" configuration property is set to true. +* @param {String} type The name of the event that was fired. +* @param {Array} args Collection of arguments sent when the +* event was fired. +* @param {Array} obj Array containing the current Menu instance +* and the item that fired the event. +*/ +enforceConstraints: function(type, args, obj) { + + var oConfig = this.cfg; + + var pos = args[0]; + + var x = pos[0]; + var y = pos[1]; + + var bod = document.getElementsByTagName('body')[0]; + var htm = document.getElementsByTagName('html')[0]; + + var bodyOverflow = Dom.getStyle(bod, "overflow"); + var htmOverflow = Dom.getStyle(htm, "overflow"); + + var offsetHeight = this.element.offsetHeight; + var offsetWidth = this.element.offsetWidth; + + var viewPortWidth = Dom.getClientWidth(); + var viewPortHeight = Dom.getClientHeight(); + + var scrollX = window.scrollX || document.body.scrollLeft; + var scrollY = window.scrollY || document.body.scrollTop; + + var topConstraint = scrollY + 10; + var leftConstraint = scrollX + 10; + var bottomConstraint = scrollY + viewPortHeight - offsetHeight - 10; + var rightConstraint = scrollX + viewPortWidth - offsetWidth - 10; + + var aContext = oConfig.getProperty("context"); + var oContextElement = aContext ? aContext[0] : null; + + + if (x < 10) { + + x = leftConstraint; + + } else if ((x + offsetWidth) > viewPortWidth) { + + if( + oContextElement && + ((x - oContextElement.offsetWidth) > offsetWidth) + ) { + + x = (x - (oContextElement.offsetWidth + offsetWidth)); + + } + else { + + x = rightConstraint; + + } + + } + + if (y < 10) { + + y = topConstraint; + + } else if (y > bottomConstraint) { + + if(oContextElement && (y > offsetHeight)) { + + y = ((y + oContextElement.offsetHeight) - offsetHeight); + + } + else { + + y = bottomConstraint; + + } + + } + + oConfig.setProperty("x", x, true); + oConfig.setProperty("y", y, true); + +}, + +/** +* @method configVisible +* @description Event handler for when the "visible" configuration property +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configVisible: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configVisible.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + else { + + var bVisible = p_aArgs[0]; + var sDisplay = Dom.getStyle(this.element, "display"); + + if(bVisible) { + + if(sDisplay != "block") { + this.beforeShowEvent.fire(); + Dom.setStyle(this.element, "display", "block"); + this.showEvent.fire(); + } + + } + else { + + if(sDisplay == "block") { + this.beforeHideEvent.fire(); + Dom.setStyle(this.element, "display", "none"); + this.hideEvent.fire(); + } + + } + + } + +}, + +/** +* @method configPosition +* @description Event handler for when the "position" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configPosition: function(p_sType, p_aArgs, p_oMenu) { + + var sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute"; + var oCfg = this.cfg; + + Dom.setStyle(this.element, "position", sCSSPosition); + + if(sCSSPosition == "static") { + + /* + Remove the iframe for statically positioned menus since it will + intercept mouse events. + */ + + oCfg.setProperty("iframe", false); + + // Statically positioned menus are visible by default + + Dom.setStyle(this.element, "display", "block"); + + oCfg.setProperty("visible", true); + + } + else { + + /* + Even though the "visible" property is queued to + "false" by default, we need to set the "visibility" property to + "hidden" since Overlay's "configVisible" implementation checks the + element's "visibility" style property before deciding whether + or not to show an Overlay instance. + */ + + Dom.setStyle(this.element, "visibility", "hidden"); + + } + + if(sCSSPosition == "absolute") { + + var nZIndex = oCfg.getProperty("zindex"); + + if(!nZIndex || nZIndex === 0) { + + nZIndex = this.parent ? + (this.parent.parent.cfg.getProperty("zindex") + 1) : 1; + + oCfg.setProperty("zindex", nZIndex); + + } + + } + +}, + +/** +* @method configIframe +* @description Event handler for when the "iframe" configuration property of +* the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configIframe: function(p_sType, p_aArgs, p_oMenu) { + + if(this.cfg.getProperty("position") == "dynamic") { + + YAHOO.widget.Menu.superclass.configIframe.call( + this, + p_sType, + p_aArgs, + p_oMenu + ); + + } + +}, + +/** +* @method configHideDelay +* @description Event handler for when the "hidedelay" configuration property +* of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configHideDelay: function(p_sType, p_aArgs, p_oMenu) { + + var nHideDelay = p_aArgs[0]; + var oMouseOutEvent = this.mouseOutEvent; + var oMouseOverEvent = this.mouseOverEvent; + var oKeyDownEvent = this.keyDownEvent; + + if(nHideDelay > 0) { + + /* + Only assign event handlers once. This way the user change + the value for the hidedelay as many times as they want. + */ + + if(!this._hideDelayEventHandlersAssigned) { + + oMouseOutEvent.subscribe(this._execHideDelay, true); + oMouseOverEvent.subscribe(this._cancelHideDelay, this, true); + oKeyDownEvent.subscribe(this._cancelHideDelay, this, true); + + this._hideDelayEventHandlersAssigned = true; + + } + + } + else { + + oMouseOutEvent.unsubscribe(this._execHideDelay, this); + oMouseOverEvent.unsubscribe(this._cancelHideDelay, this); + oKeyDownEvent.unsubscribe(this._cancelHideDelay, this); + + this._hideDelayEventHandlersAssigned = false; + + } + +}, + +/** +* @method configContainer +* @description Event handler for when the "container" configuration property +of the menu changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that +* fired the event. +*/ +configContainer: function(p_sType, p_aArgs, p_oMenu) { + + var oElement = p_aArgs[0]; + + if(typeof oElement == 'string') { + + this.cfg.setProperty( + "container", + document.getElementById(oElement), + true + ); + + } + +}, + +// Public methods + +/** +* Event handler called when the resize monitor element's "resize" evet is fired. +*/ +onDomResize: function(e, obj) { + + if(!this._handleResize) { + + this._handleResize = true; + return; + + } + + var oConfig = this.cfg; + + if(oConfig.getProperty("position") == "dynamic") { + + oConfig.setProperty("width", (this._getOffsetWidth() + "px")); + + } + + YAHOO.widget.Menu.superclass.onDomResize.call(this, e, obj); + +}, + +/** +* @method initEvents +* @description Initializes the custom events for the menu. +*/ +initEvents: function() { + + YAHOO.widget.Menu.superclass.initEvents.call(this); + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.itemAddedEvent = new CustomEvent("itemAddedEvent", this); + this.itemRemovedEvent = new CustomEvent("itemRemovedEvent", this); + +}, + +/** +* @method getRoot +* @description Finds the menu's root menu. +*/ +getRoot: function() { + + var oItem = this.parent; + + if(oItem) { + + var oParentMenu = oItem.parent; + + return oParentMenu ? oParentMenu.getRoot() : this; + + } + else { + + return this; + + } + +}, + +/** +* @method toString +* @description Returns a string representing the menu. +* @return {String} +*/ +toString: function() { + + return ("Menu " + this.id); + +}, + +/** +* @method setItemGroupTitle +* @description Sets the title of a group of menu items. +* @param {String} p_sGroupTitle String specifying the title of the group. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to which +* the title belongs. +*/ +setItemGroupTitle: function(p_sGroupTitle, p_nGroupIndex) { + + if(typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) { + + var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0; + var oTitle = this._aGroupTitleElements[nGroupIndex]; + + if(oTitle) { + + oTitle.innerHTML = p_sGroupTitle; + + } + else { + + oTitle = document.createElement(this.GROUP_TITLE_TAG_NAME); + + oTitle.innerHTML = p_sGroupTitle; + + this._aGroupTitleElements[nGroupIndex] = oTitle; + + } + + var i = this._aGroupTitleElements.length - 1; + var nFirstIndex; + + do { + + if(this._aGroupTitleElements[i]) { + + Dom.removeClass(this._aGroupTitleElements[i], "first-of-type"); + + nFirstIndex = i; + + } + + } + while(i--); + + if(nFirstIndex !== null) { + + Dom.addClass( + this._aGroupTitleElements[nFirstIndex], + "first-of-type" + ); + + } + + } + +}, + +/** +* @method addItem +* @description Appends an item to the menu. +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem +* instance to be added to the menu. +* @param {String} p_oItem String specifying the text of the item to be added +* to the menu. +* @param {Object} p_oItem Object literal containing a set of menu item +* configuration properties. +* @param {Number} p_nGroupIndex Optional. Number indicating the group to +* which the item belongs. +* @return {YAHOO.widget.MenuItem} +*/ +addItem: function(p_oItem, p_nGroupIndex) { + + if(p_oItem) { + + return this._addItemToGroup(p_nGroupIndex, p_oItem); + + } + +}, + +/** +* @method addItems +* @description Adds an array of items to the menu. +* @param {Array} p_aItems Array of items to be added to the menu. The array +* can contain strings specifying the text for each item to be created, object +* literals specifying each of the menu item configuration properties, +* or MenuItem instances. +* @param {Number} p_nGroupIndex Optional. Number specifying the group to +* which the items belongs. +* @return {Array} +*/ +addItems: function(p_aItems, p_nGroupIndex) { + + function isArray(p_oValue) { + + return (typeof p_oValue == "object" && p_oValue.constructor == Array); + + } + + if(isArray(p_aItems)) { + + var nItems = p_aItems.length; + var aItems = []; + var oItem; + + for(var i=0; i<div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove Custom Event listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + + var nItemGroups = this._aItemGroups.length; + var nItems; + var oItemGroup; + var oItem; + var i; + var n; + + // Remove all items + + if(nItemGroups > 0) { + + i = nItemGroups - 1; + + do { + + oItemGroup = this._aItemGroups[i]; + + if(oItemGroup) { + + nItems = oItemGroup.length; + + if(nItems > 0) { + + n = nItems - 1; + + do { + + oItem = this._aItemGroups[i][n]; + + if(oItem) { + + oItem.destroy(); + } + + } + while(n--); + + } + + } + + } + while(i--); + + } + + // Continue with the superclass implementation of this method + + YAHOO.widget.Menu.superclass.destroy.call(this); + + +}, + +/** +* @method setInitialFocus +* @description Sets focus to the menu's first enabled item. +*/ +setInitialFocus: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.focus(); + } + +}, + +/** +* @method setInitialSelection +* @description Sets the "selected" configuration property of the menu's first +* enabled item to "true." +*/ +setInitialSelection: function() { + + var oItem = this._getFirstEnabledItem(); + + if(oItem) { + + oItem.cfg.setProperty("selected", true); + } + +}, + +/** +* @method clearActiveItem +* @description Sets the "selected" configuration property of the menu's active +* item to "false" and hides the item's submenu. +* @param {Boolean} p_bBlur Boolean indicating if the menu's active item +* should be blurred. +*/ +clearActiveItem: function(p_bBlur) { + + if(this.cfg.getProperty("showdelay") > 0) { + + this._cancelShowDelay(); + + } + + var oActiveItem = this.activeItem; + + if(oActiveItem) { + + var oConfig = oActiveItem.cfg; + + oConfig.setProperty("selected", false); + + var oSubmenu = oConfig.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.hide(); + + } + + if(p_bBlur) { + + oActiveItem.blur(); + + } + + } + +}, + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.Menu.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration properties + + /* + Change the default value for the "visible" configuration + property to "false" by re-adding the property. + */ + + /** + * @config visible + * @description Boolean indicating whether or not the menu is visible. If + * the menu's "position" configuration property is set to "dynamic" (the + * default), this property toggles the menu's <div> + * element's "visibility" style property between "visible" (true) or + * "hidden" (false). If the menu's "position" configuration property is + * set to "static" this property toggles the menu's + * <div> element's "display" style property + * between "block" (true) or "none" (false). + * @default false + * @type Boolean + */ + oConfig.addProperty( + "visible", + { + value:false, + handler:this.configVisible, + validator:this.cfg.checkBoolean + } + ); + + /* + Change the default value for the "constraintoviewport" configuration + property to "true" by re-adding the property. + */ + + /** + * @config constraintoviewport + * @description Boolean indicating if the menu will try to remain inside + * the boundaries of the size of viewport. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "constraintoviewport", + { + value:true, + handler:this.configConstrainToViewport, + validator:this.cfg.checkBoolean, + supercedes:["iframe","x","y","xy"] + } + ); + + /** + * @config position + * @description String indicating how a menu should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menus are + * visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menus are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and + * can overlay other elements on the screen. + * @default dynamic + * @type String + */ + oConfig.addProperty( + "position", + { + value: "dynamic", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu item. The format is: [itemCorner, submenuCorner]. By default + * a submenu's top left corner is aligned to its parent menu item's top + * right corner. + * @default ["tl","tr"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","tr"] } ); + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu's items. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + /** + * @config showdelay + * @description Number indicating the time (in milliseconds) that should + * expire before a submenu is made visible when the user mouses over + * the menu's items. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "showdelay", + { + value: 0, + validator: oConfig.checkNumber + } + ); + + /** + * @config hidedelay + * @description Number indicating the time (in milliseconds) that should + * expire before the menu is hidden. + * @default 0 + * @type Number + */ + oConfig.addProperty( + "hidedelay", + { + value: 0, + validator: oConfig.checkNumber, + handler: this.configHideDelay, + suppressEvent: true + } + ); + + /** + * @config clicktohide + * @description Boolean indicating if the menu will automatically be + * hidden if the user clicks outside of it. + * @default true + * @type Boolean + */ + oConfig.addProperty( + "clicktohide", + { + value: true, + validator: oConfig.checkBoolean + } + ); + + /** + * @config container + * @description HTML element reference or string specifying the id + * attribute of the HTML element that the menu's markup should be rendered into. + * @type HTMLElement|String + * @default document.body + */ + this.cfg.addProperty( + "container", + { value:document.body, handler:this.configContainer } + ); + +} + +}); // END YAHOO.extend + +})(); + +/** +* The base class for all menuing containers. +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu module. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu module. +* @param {HTMLDivElement} p_oElement Object +* specifying the <div> element of the menu module. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu module. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu module. See configuration class documentation for +* more details. +* @class MenuModule +* @constructor +* @extends YAHOO.widget.Overlay +* @deprecated As of version 0.12, all MenuModule functionality has been +* implemented directly in YAHOO.widget.Menu, making YAHOO.widget.Menu the base +* class for all menuing containers. +*/ +YAHOO.widget.MenuModule = YAHOO.widget.Menu; + +(function() { + +var Dom = YAHOO.util.Dom; +var Module = YAHOO.widget.Module; +var Menu = YAHOO.widget.Menu; + +/** +* Creates an item for a menu. +* +* @param {String} p_oObject String specifying the text of the menu item. +* @param {HTMLLIElement} p_oObject Object specifying +* the <li> element of the menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu item. +* @param {HTMLOptionElement} p_oObject Object +* specifying the <option> element of the menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu item. See configuration class documentation +* for more details. +* @class MenuItem +* @constructor +*/ +YAHOO.widget.MenuItem = function(p_oObject, p_oConfig) { + + if(p_oObject) { + + if(p_oConfig) { + + this.parent = p_oConfig.parent; + this.value = p_oConfig.value; + + } + + this.init(p_oObject, p_oConfig); + + } + +}; + +YAHOO.widget.MenuItem.prototype = { + + // Constants + + /** + * @property SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * menu item's submenu arrow indicator. + * @default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif" + * @final + * @type String + */ + SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_nrm_1.gif", + + /** + * @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is selected. + * @default "nt/ic/ut/alt1/menuarorght8_hov_1.gif" + * @final + * @type String + */ + SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_hov_1.gif", + + /** + * @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + * @description String representing the path to the image to be used for the + * submenu arrow indicator when the menu item is disabled. + * @default "nt/ic/ut/alt1/menuarorght8_dim_1.gif" + * @final + * @type String + */ + DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: + "nt/ic/ut/alt1/menuarorght8_dim_1.gif", + + /** + * @property COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator. + * @default "Collapsed. Click to expand." + * @final + * @type String + */ + COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT: "Collapsed. Click to expand.", + + /** + * @property EXPANDED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the submenu is visible. + * @default "Expanded. Click to collapse." + * @final + * @type String + */ + EXPANDED_SUBMENU_INDICATOR_ALT_TEXT: "Expanded. Click to collapse.", + + /** + * @property DISABLED_SUBMENU_INDICATOR_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the submenu arrow indicator when the menu item is disabled. + * @default "Disabled." + * @final + * @type String + */ + DISABLED_SUBMENU_INDICATOR_ALT_TEXT: "Disabled.", + + /** + * @property CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the checked state. + * @default "nt/ic/ut/bsc/menuchk8_nrm_1.gif" + * @final + * @type String + */ + CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_nrm_1.gif", + + + /** + * @property SELECTED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the selected checked state. + * @default "nt/ic/ut/bsc/menuchk8_hov_1.gif" + * @final + * @type String + */ + SELECTED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_hov_1.gif", + + + /** + * @property DISABLED_CHECKED_IMAGE_PATH + * @description String representing the path to the image to be used for + * the disabled checked state. + * @default "nt/ic/ut/bsc/menuchk8_dim_1.gif" + * @final + * @type String + */ + DISABLED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_dim_1.gif", + + + /** + * @property CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image. + * @default "Checked." + * @final + * @type String + */ + CHECKED_IMAGE_ALT_TEXT: "Checked.", + + + /** + * @property DISABLED_CHECKED_IMAGE_ALT_TEXT + * @description String representing the alt text for the image to be used + * for the checked image when the item is disabled. + * @default "Checked. (Item disabled.)" + * @final + * @type String + */ + DISABLED_CHECKED_IMAGE_ALT_TEXT: "Checked. (Item disabled.)", + + /** + * @property CSS_CLASS_NAME + * @description String representing the CSS class(es) to be applied to the + * <li> element of the menu item. + * @default "yuimenuitem" + * @final + * @type String + */ + CSS_CLASS_NAME: "yuimenuitem", + + /** + * @property SUBMENU_TYPE + * @description Object representing the type of menu to instantiate and + * add when parsing the child nodes of the menu item's source HTML element. + * @final + * @type YAHOO.widget.Menu + */ + SUBMENU_TYPE: null, + + /** + * @property IMG_ROOT + * @description String representing the prefix path to use for + * non-secure images. + * @default "http://us.i1.yimg.com/us.yimg.com/i/" + * @type String + */ + IMG_ROOT: "http://us.i1.yimg.com/us.yimg.com/i/", + + + /** + * @property IMG_ROOT_SSL + * @description String representing the prefix path to use for securely + * served images. + * @default "https://a248.e.akamai.net/sec.yimg.com/i/" + * @type String + */ + IMG_ROOT_SSL: "https://a248.e.akamai.net/sec.yimg.com/i/", + + // Private member variables + + /** + * @property _oAnchor + * @description Object reference to the menu item's + * <a> element. + * @default null + * @private + * @type HTMLAnchorElement + */ + _oAnchor: null, + + + /** + * @property _oText + * @description Object reference to the menu item's text node. + * @default null + * @private + * @type TextNode + */ + _oText: null, + + + /** + * @property _oHelpTextEM + * @description Object reference to the menu item's help text + * <em> element. + * @default null + * @private + * @type HTMLElement + */ + _oHelpTextEM: null, + + + /** + * @property _oSubmenu + * @description Object reference to the menu item's submenu. + * @default null + * @private + * @type YAHOO.widget.Menu + */ + _oSubmenu: null, + + /** + * @property _checkImage + * @description Object reference to the menu item's checkmark image. + * @default null + * @private + * @type HTMLImageElement + */ + _checkImage: null, + + // Public properties + + /** + * @property constructor + * @description Object reference to the menu item's constructor function. + * @default YAHOO.widget.MenuItem + * @type YAHOO.widget.MenuItem + */ + constructor: YAHOO.widget.MenuItem, + + /** + * @property imageRoot + * @description String representing the root path for all of the menu + * item's images. + * @type String + */ + imageRoot: null, + + /** + * @property isSecure + * @description Boolean representing whether or not the current browsing + * context is secure (HTTPS). + * @type Boolean + */ + isSecure: Module.prototype.isSecure, + + /** + * @property index + * @description Number indicating the ordinal position of the menu item in + * its group. + * @default null + * @type Number + */ + index: null, + + /** + * @property groupIndex + * @description Number indicating the index of the group to which the menu + * item belongs. + * @default null + * @type Number + */ + groupIndex: null, + + /** + * @property parent + * @description Object reference to the menu item's parent menu. + * @default null + * @type YAHOO.widget.Menu + */ + parent: null, + + /** + * @property element + * @description Object reference to the menu item's + * <li> element. + * @default HTMLLIElement + * @type HTMLLIElement + */ + element: null, + + /** + * @property srcElement + * @description Object reference to the HTML element (either + * <li>, <optgroup> or + * <option>) used create the menu item. + * @default HTMLLIElement|HTMLOptGroupElement|HTMLOptionElement + * @type HTMLLIElement| + * HTMLOptGroupElement|HTMLOptionElement + */ + srcElement: null, + + /** + * @property value + * @description Object reference to the menu item's value. + * @default null + * @type Object + */ + value: null, + + /** + * @property submenuIndicator + * @description Object reference to the <img> element + * used to create the submenu indicator for the menu item. + * @default HTMLImageElement + * @type HTMLImageElement + */ + submenuIndicator: null, + + /** + * @property browser + * @description String representing the browser. + * @type String + */ + browser: Module.prototype.browser, + + // Events + + /** + * @event destroyEvent + * @description Fires when the menu item's <li> + * element is removed from its parent <ul> element. + * @type YAHOO.util.CustomEvent + */ + destroyEvent: null, + + /** + * @event mouseOverEvent + * @description Fires when the mouse has entered the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOverEvent: null, + + /** + * @event mouseOutEvent + * @description Fires when the mouse has left the menu item. Passes back + * the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseOutEvent: null, + + /** + * @event mouseDownEvent + * @description Fires when the user mouses down on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseDownEvent: null, + + /** + * @event mouseUpEvent + * @description Fires when the user releases a mouse button while the mouse + * is over the menu item. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + mouseUpEvent: null, + + /** + * @event clickEvent + * @description Fires when the user clicks the on the menu item. Passes + * back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + clickEvent: null, + + /** + * @event keyPressEvent + * @description Fires when the user presses an alphanumeric key when the + * menu item has focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyPressEvent: null, + + /** + * @event keyDownEvent + * @description Fires when the user presses a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyDownEvent: null, + + /** + * @event keyUpEvent + * @description Fires when the user releases a key when the menu item has + * focus. Passes back the DOM Event object as an argument. + * @type YAHOO.util.CustomEvent + */ + keyUpEvent: null, + + /** + * @event focusEvent + * @description Fires when the menu item receives focus. + * @type YAHOO.util.CustomEvent + */ + focusEvent: null, + + /** + * @event blurEvent + * @description Fires when the menu item loses the input focus. + * @type YAHOO.util.CustomEvent + */ + blurEvent: null, + + /** + * @method init + * @description The MenuItem class's initialization method. This method is + * automatically called by the constructor, and sets up all DOM references + * for pre-existing markup, and creates required markup if it is not + * already present. + * @param {String} p_oObject String specifying the text of the menu item. + * @param {HTMLLIElement} p_oObject Object specifying + * the <li> element of the menu item. + * @param {HTMLOptGroupElement} p_oObject Object + * specifying the <optgroup> element of the menu item. + * @param {HTMLOptionElement} p_oObject Object + * specifying the <option> element of the menu item. + * @param {Object} p_oConfig Optional. Object literal specifying the + * configuration for the menu item. See configuration class documentation + * for more details. + */ + init: function(p_oObject, p_oConfig) { + + this.imageRoot = (this.isSecure) ? this.IMG_ROOT_SSL : this.IMG_ROOT; + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = Menu; + + } + + // Create the config object + + this.cfg = new YAHOO.util.Config(this); + + this.initDefaultConfig(); + + var oConfig = this.cfg; + + if(this._checkString(p_oObject)) { + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject); + + } + else if(this._checkDOMNode(p_oObject)) { + + switch(p_oObject.tagName.toUpperCase()) { + + case "OPTION": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.text); + + this.srcElement = p_oObject; + + break; + + case "OPTGROUP": + + this._createRootNodeStructure(); + + oConfig.setProperty("text", p_oObject.label); + + this.srcElement = p_oObject; + + this._initSubTree(); + + break; + + case "LI": + + // Get the anchor node (if it exists) + + var oAnchor = this._getFirstElement(p_oObject, "A"); + var sURL = "#"; + var sTarget = null; + var sText = null; + + // Capture the "text" and/or the "URL" + + if(oAnchor) { + + sURL = oAnchor.getAttribute("href"); + sTarget = oAnchor.getAttribute("target"); + + if(oAnchor.innerText) { + + sText = oAnchor.innerText; + + } + else { + + var oRange = oAnchor.ownerDocument.createRange(); + + oRange.selectNodeContents(oAnchor); + + sText = oRange.toString(); + + } + + } + else { + + var oText = p_oObject.firstChild; + + sText = oText.nodeValue; + + oAnchor = document.createElement("a"); + + oAnchor.setAttribute("href", sURL); + + p_oObject.replaceChild(oAnchor, oText); + + oAnchor.appendChild(oText); + + } + + this.srcElement = p_oObject; + this.element = p_oObject; + this._oAnchor = oAnchor; + + + // Check if emphasis has been applied to the MenuItem + + var oEmphasisNode = this._getFirstElement(oAnchor); + var bEmphasis = false; + var bStrongEmphasis = false; + + if(oEmphasisNode) { + + // Set a reference to the text node + + this._oText = oEmphasisNode.firstChild; + + switch(oEmphasisNode.tagName.toUpperCase()) { + + case "EM": + + bEmphasis = true; + + break; + + case "STRONG": + + bStrongEmphasis = true; + + break; + + } + + } + else { + + // Set a reference to the text node + + this._oText = oAnchor.firstChild; + + } + + /* + Set these properties silently to sync up the + configuration object without making changes to the + element's DOM + */ + + oConfig.setProperty("text", sText, true); + oConfig.setProperty("url", sURL, true); + oConfig.setProperty("target", sTarget, true); + oConfig.setProperty("emphasis", bEmphasis, true); + oConfig.setProperty( + "strongemphasis", + bStrongEmphasis, + true + ); + + this._initSubTree(); + + break; + + } + + } + + if(this.element) { + + Dom.addClass(this.element, this.CSS_CLASS_NAME); + + // Create custom events + + var CustomEvent = YAHOO.util.CustomEvent; + + this.destroyEvent = new CustomEvent("destroyEvent", this); + this.mouseOverEvent = new CustomEvent("mouseOverEvent", this); + this.mouseOutEvent = new CustomEvent("mouseOutEvent", this); + this.mouseDownEvent = new CustomEvent("mouseDownEvent", this); + this.mouseUpEvent = new CustomEvent("mouseUpEvent", this); + this.clickEvent = new CustomEvent("clickEvent", this); + this.keyPressEvent = new CustomEvent("keyPressEvent", this); + this.keyDownEvent = new CustomEvent("keyDownEvent", this); + this.keyUpEvent = new CustomEvent("keyUpEvent", this); + this.focusEvent = new CustomEvent("focusEvent", this); + this.blurEvent = new CustomEvent("blurEvent", this); + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig); + + } + + oConfig.fireQueue(); + + } + + }, + + // Private methods + + /** + * @method _getFirstElement + * @description Returns an HTML element's first HTML element node. + * @private + * @param {HTMLElement} p_oElement Object + * reference specifying the element to be evaluated. + * @param {String} p_sTagName Optional. String specifying the tagname of + * the element to be retrieved. + * @return {HTMLElement} + */ + _getFirstElement: function(p_oElement, p_sTagName) { + + var oElement; + + if(p_oElement.firstChild && p_oElement.firstChild.nodeType == 1) { + + oElement = p_oElement.firstChild; + + } + else if( + p_oElement.firstChild && + p_oElement.firstChild.nextSibling && + p_oElement.firstChild.nextSibling.nodeType == 1 + ) { + + oElement = p_oElement.firstChild.nextSibling; + + } + + if(p_sTagName) { + + return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ? + oElement : false; + + } + + return oElement; + + }, + + /** + * @method _checkString + * @description Determines if an object is a string. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkString: function(p_oObject) { + + return (typeof p_oObject == "string"); + + }, + + /** + * @method _checkDOMNode + * @description Determines if an object is an HTML element. + * @private + * @param {Object} p_oObject Object to be evaluated. + * @return {Boolean} + */ + _checkDOMNode: function(p_oObject) { + + return (p_oObject && p_oObject.tagName); + + }, + + /** + * @method _createRootNodeStructure + * @description Creates the core DOM structure for the menu item. + * @private + */ + _createRootNodeStructure: function () { + + this.element = document.createElement("li"); + + this._oText = document.createTextNode(""); + + this._oAnchor = document.createElement("a"); + this._oAnchor.appendChild(this._oText); + + this.cfg.refireEvent("url"); + + this.element.appendChild(this._oAnchor); + + }, + + /** + * @method _initSubTree + * @description Iterates the source element's childNodes collection and uses + * the child nodes to instantiate other menus. + * @private + */ + _initSubTree: function() { + + var oSrcEl = this.srcElement; + var oConfig = this.cfg; + + if(oSrcEl.childNodes.length > 0) { + + if( + this.parent.lazyLoad && + this.parent.srcElement && + this.parent.srcElement.tagName.toUpperCase() == "SELECT" + ) { + + oConfig.setProperty( + "submenu", + { id: Dom.generateId(), itemdata: oSrcEl.childNodes } + ); + + } + else { + + var oNode = oSrcEl.firstChild; + var aOptions = []; + + do { + + if(oNode && oNode.tagName) { + + switch(oNode.tagName.toUpperCase()) { + + case "DIV": + + oConfig.setProperty("submenu", oNode); + + break; + + case "OPTION": + + aOptions[aOptions.length] = oNode; + + break; + + } + + } + + } + while((oNode = oNode.nextSibling)); + + + var nOptions = aOptions.length; + + if(nOptions > 0) { + + var oMenu = new this.SUBMENU_TYPE(Dom.generateId()); + + oConfig.setProperty("submenu", oMenu); + + for(var n=0; n 0) { + + oAnchor.setAttribute("target", sTarget); + + } + else { + + oAnchor.removeAttribute("target"); + + } + + }, + + /** + * @method configEmphasis + * @description Event handler for when the "emphasis" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bEmphasis = p_aArgs[0]; + var oAnchor = this._oAnchor; + var oText = this._oText; + var oConfig = this.cfg; + var oEM; + + if(bEmphasis && oConfig.getProperty("strongemphasis")) { + + oConfig.setProperty("strongemphasis", false); + + } + + if(oAnchor) { + + if(bEmphasis) { + + oEM = document.createElement("em"); + oEM.appendChild(oText); + + oAnchor.appendChild(oEM); + + } + else { + + oEM = this._getFirstElement(oAnchor, "EM"); + + oAnchor.removeChild(oEM); + oAnchor.appendChild(oText); + + } + + } + + }, + + /** + * @method configStrongEmphasis + * @description Event handler for when the "strongemphasis" configuration + * property of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configStrongEmphasis: function(p_sType, p_aArgs, p_oItem) { + + var bStrongEmphasis = p_aArgs[0]; + var oAnchor = this._oAnchor; + var oText = this._oText; + var oConfig = this.cfg; + var oStrong; + + if(bStrongEmphasis && oConfig.getProperty("emphasis")) { + + oConfig.setProperty("emphasis", false); + + } + + if(oAnchor) { + + if(bStrongEmphasis) { + + oStrong = document.createElement("strong"); + oStrong.appendChild(oText); + + oAnchor.appendChild(oStrong); + + } + else { + + oStrong = this._getFirstElement(oAnchor, "STRONG"); + + oAnchor.removeChild(oStrong); + oAnchor.appendChild(oText); + + } + + } + + }, + + /** + * @method configChecked + * @description Event handler for when the "checked" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configChecked: function(p_sType, p_aArgs, p_oItem) { + + var bChecked = p_aArgs[0]; + var oEl = this.element; + var oConfig = this.cfg; + var oImg; + + + if(bChecked) { + + this._preloadImage(this.CHECKED_IMAGE_PATH); + this._preloadImage(this.SELECTED_CHECKED_IMAGE_PATH); + this._preloadImage(this.DISABLED_CHECKED_IMAGE_PATH); + + oImg = document.createElement("img"); + oImg.src = (this.imageRoot + this.CHECKED_IMAGE_PATH); + oImg.alt = this.CHECKED_IMAGE_ALT_TEXT; + + var oSubmenu = this.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oEl.insertBefore(oImg, oSubmenu.element); + + } + else { + + oEl.appendChild(oImg); + + } + + Dom.addClass([oEl, oImg], "checked"); + + this._checkImage = oImg; + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + else { + + oImg = this._checkImage; + + Dom.removeClass([oEl, oImg], "checked"); + + if(oImg) { + + oEl.removeChild(oImg); + + } + + this._checkImage = null; + + } + + }, + + /** + * @method configDisabled + * @description Event handler for when the "disabled" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configDisabled: function(p_sType, p_aArgs, p_oItem) { + + var bDisabled = p_aArgs[0]; + var oAnchor = this._oAnchor; + var aNodes = [this.element, oAnchor]; + var oEM = this._oHelpTextEM; + var oConfig = this.cfg; + var oImg; + var sImgSrc; + var sImgAlt; + + if(oEM) { + + aNodes[2] = oEM; + + } + + if(this.cfg.getProperty("checked")) { + + sImgAlt = this.CHECKED_IMAGE_ALT_TEXT; + sImgSrc = this.CHECKED_IMAGE_PATH; + oImg = this._checkImage; + + if(bDisabled) { + + sImgAlt = this.DISABLED_CHECKED_IMAGE_ALT_TEXT; + sImgSrc = this.DISABLED_CHECKED_IMAGE_PATH; + + } + + oImg.src = document.images[(this.imageRoot + sImgSrc)].src; + oImg.alt = sImgAlt; + + } + + oImg = this.submenuIndicator; + + if(bDisabled) { + + if(oConfig.getProperty("selected")) { + + oConfig.setProperty("selected", false); + + } + + oAnchor.removeAttribute("href"); + + Dom.addClass(aNodes, "disabled"); + + sImgSrc = this.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH; + sImgAlt = this.DISABLED_SUBMENU_INDICATOR_ALT_TEXT; + + } + else { + + oAnchor.setAttribute("href", oConfig.getProperty("url")); + + Dom.removeClass(aNodes, "disabled"); + + sImgSrc = this.SUBMENU_INDICATOR_IMAGE_PATH; + sImgAlt = this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT; + + } + + if(oImg) { + + oImg.src = this.imageRoot + sImgSrc; + oImg.alt = sImgAlt; + + } + + }, + + /** + * @method configSelected + * @description Event handler for when the "selected" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSelected: function(p_sType, p_aArgs, p_oItem) { + + if(!this.cfg.getProperty("disabled")) { + + var bSelected = p_aArgs[0]; + var oEM = this._oHelpTextEM; + var aNodes = [this.element, this._oAnchor]; + var oImg = this.submenuIndicator; + var sImgSrc; + + if(oEM) { + + aNodes[aNodes.length] = oEM; + + } + + if(oImg) { + + aNodes[aNodes.length] = oImg; + + } + + + if(this.cfg.getProperty("checked")) { + + sImgSrc = this.imageRoot + (bSelected ? + this.SELECTED_CHECKED_IMAGE_PATH : this.CHECKED_IMAGE_PATH); + + this._checkImage.src = document.images[sImgSrc].src; + + } + + if(bSelected) { + + Dom.addClass(aNodes, "selected"); + sImgSrc = this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH; + + } + else { + + Dom.removeClass(aNodes, "selected"); + sImgSrc = this.SUBMENU_INDICATOR_IMAGE_PATH; + + } + + if(oImg) { + + oImg.src = document.images[(this.imageRoot + sImgSrc)].src; + + } + + } + + }, + + /** + * @method configSubmenu + * @description Event handler for when the "submenu" configuration property + * of the menu item changes. + * @param {String} p_sType String representing the name of the event that + * was fired. + * @param {Array} p_aArgs Array of arguments sent when the event was fired. + * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item + * that fired the event. + */ + configSubmenu: function(p_sType, p_aArgs, p_oItem) { + + var oEl = this.element; + var oSubmenu = p_aArgs[0]; + var oImg = this.submenuIndicator; + var oConfig = this.cfg; + var aNodes = [this.element, this._oAnchor]; + var oMenu; + var bLazyLoad = this.parent && this.parent.lazyLoad; + + if(oSubmenu) { + + if(oSubmenu instanceof Menu) { + + oMenu = oSubmenu; + oMenu.parent = this; + oMenu.lazyLoad = bLazyLoad; + + } + else if( + typeof oSubmenu == "object" && + oSubmenu.id && + !oSubmenu.nodeType + ) { + + var sSubmenuId = oSubmenu.id; + var oSubmenuConfig = oSubmenu; + + delete oSubmenu["id"]; + + oSubmenuConfig.lazyload = bLazyLoad; + oSubmenuConfig.parent = this; + + oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig); + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + else { + + oMenu = new this.SUBMENU_TYPE( + oSubmenu, + { lazyload: bLazyLoad, parent: this } + ); + + // Set the value of the property to the Menu instance + + this.cfg.setProperty("submenu", oMenu, true); + + } + + if(oMenu) { + + this._oSubmenu = oMenu; + + if(!oImg) { + + this._preloadImage(this.SUBMENU_INDICATOR_IMAGE_PATH); + this._preloadImage( + this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH + ); + + this._preloadImage( + this.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH + ); + + oImg = document.createElement("img"); + + oImg.src = + (this.imageRoot + this.SUBMENU_INDICATOR_IMAGE_PATH); + + oImg.alt = this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT; + + oEl.appendChild(oImg); + + this.submenuIndicator = oImg; + + Dom.addClass(aNodes, "hassubmenu"); + + if(oConfig.getProperty("disabled")) { + + oConfig.refireEvent("disabled"); + + } + + if(oConfig.getProperty("selected")) { + + oConfig.refireEvent("selected"); + + } + + } + + } + + } + else { + + Dom.removeClass(aNodes, "hassubmenu"); + + if(oImg) { + + oEl.removeChild(oImg); + + } + + if(this._oSubmenu) { + + this._oSubmenu.destroy(); + + } + + } + + }, + + // Public methods + + /** + * @method initDefaultConfig + * @description Initializes an item's configurable properties. + */ + initDefaultConfig : function() { + + var oConfig = this.cfg; + var CheckBoolean = oConfig.checkBoolean; + + // Define the config properties + + /** + * @config text + * @description String specifying the text label for the menu item. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default "" + * @type String + */ + oConfig.addProperty( + "text", + { + value: "", + handler: this.configText, + validator: this._checkString, + suppressEvent: true + } + ); + + + /** + * @config helptext + * @description String specifying additional instructional text to + * accompany the text for the nenu item. + * @default null + * @type String| + * HTMLElement + */ + oConfig.addProperty("helptext", { handler: this.configHelpText }); + + /** + * @config url + * @description String specifying the URL for the menu item's anchor's + * "href" attribute. When building a menu from existing HTML the value + * of this property will be interpreted from the menu's markup. + * @default "#" + * @type String + */ + oConfig.addProperty( + "url", + { value: "#", handler: this.configURL, suppressEvent: true } + ); + + /** + * @config target + * @description String specifying the value for the "target" attribute + * of the menu item's anchor element. Specifying a target will + * require the user to click directly on the menu item's anchor node in + * order to cause the browser to navigate to the specified URL. + * When building a menu from existing HTML the value of this property + * will be interpreted from the menu's markup. + * @default null + * @type String + */ + oConfig.addProperty( + "target", + { handler: this.configTarget, suppressEvent: true } + ); + + /** + * @config emphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with emphasis. When building a menu from existing HTML the + * value of this property will be interpreted from the menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "emphasis", + { + value: false, + handler: this.configEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + /** + * @config strongemphasis + * @description Boolean indicating if the text of the menu item will be + * rendered with strong emphasis. When building a menu from existing + * HTML the value of this property will be interpreted from the + * menu's markup. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "strongemphasis", + { + value: false, + handler: this.configStrongEmphasis, + validator: CheckBoolean, + suppressEvent: true + } + ); + + /** + * @config checked + * @description Boolean indicating if the menu item should be rendered + * with a checkmark. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "checked", + { + value: false, + handler: this.configChecked, + validator: this.cfg.checkBoolean, + suppressEvent: true, + supercedes:["disabled"] + } + ); + + /** + * @config disabled + * @description Boolean indicating if the menu item should be disabled. + * (Disabled menu items are dimmed and will not respond to user input + * or fire events.) + * @default false + * @type Boolean + */ + oConfig.addProperty( + "disabled", + { + value: false, + handler: this.configDisabled, + validator: CheckBoolean, + suppressEvent: true + } + ); + + /** + * @config selected + * @description Boolean indicating if the menu item should + * be highlighted. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "selected", + { + value: false, + handler: this.configSelected, + validator: CheckBoolean, + suppressEvent: true + } + ); + + /** + * @config submenu + * @description Object specifying the submenu to be appended to the + * menu item. The value can be one of the following:
  • Object + * specifying a Menu instance.
  • Object literal specifying the + * menu to be created. Format: { id: [menu id], itemdata: + * [array of values for + * items] }.
  • String specifying the id attribute + * of the <div> element of the menu.
  • + * Object specifying the <div> element of the + * menu.
+ * @default null + * @type Menu|String|Object| + * HTMLElement + */ + oConfig.addProperty("submenu", { handler: this.configSubmenu }); + + }, + + /** + * @method getNextEnabledSibling + * @description Finds the menu item's next enabled sibling. + * @return YAHOO.widget.MenuItem + */ + getNextEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + /** + * Finds the next item in an array. + * @private + * @param {p_aArray} Array to search. + * @param {p_nStartIndex} Number indicating the index to + * start searching the array. + * @return {Object} + */ + var getNextArrayItem = function(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getNextArrayItem(p_aArray, (p_nStartIndex+1)); + + }; + + + var aItemGroups = this.parent.getItemGroups(); + var oNextItem; + + + if(this.index < (aItemGroups[nGroupIndex].length - 1)) { + + oNextItem = getNextArrayItem( + aItemGroups[nGroupIndex], + (this.index+1) + ); + + } + else { + + var nNextGroupIndex; + + if(nGroupIndex < (aItemGroups.length - 1)) { + + nNextGroupIndex = nGroupIndex + 1; + + } + else { + + nNextGroupIndex = 0; + + } + + var aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex); + + // Retrieve the first menu item in the next group + + oNextItem = getNextArrayItem(aNextGroup, 0); + + } + + return ( + oNextItem.cfg.getProperty("disabled") || + oNextItem.element.style.display == "none" + ) ? + oNextItem.getNextEnabledSibling() : oNextItem; + + } + + }, + + /** + * @method getPreviousEnabledSibling + * @description Finds the menu item's previous enabled sibling. + * @return {YAHOO.widget.MenuItem} + */ + getPreviousEnabledSibling: function() { + + if(this.parent instanceof Menu) { + + var nGroupIndex = this.groupIndex; + + /** + * Returns the previous item in an array + * @private + * @param {p_aArray} Array to search. + * @param {p_nStartIndex} Number indicating the index to + * start searching the array. + * @return {Object} + */ + var getPreviousArrayItem = function(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] || + getPreviousArrayItem(p_aArray, (p_nStartIndex-1)); + + }; + + /** + * Get the index of the first item in an array + * @private + * @param {p_aArray} Array to search. + * @param {p_nStartIndex} Number indicating the index to + * start searching the array. + * @return {Object} + */ + var getFirstItemIndex = function(p_aArray, p_nStartIndex) { + + return p_aArray[p_nStartIndex] ? + p_nStartIndex : + getFirstItemIndex(p_aArray, (p_nStartIndex+1)); + + }; + + var aItemGroups = this.parent.getItemGroups(); + var oPreviousItem; + + if( + this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0) + ) { + + oPreviousItem = + getPreviousArrayItem( + aItemGroups[nGroupIndex], + (this.index-1) + ); + + } + else { + + var nPreviousGroupIndex; + + if(nGroupIndex > getFirstItemIndex(aItemGroups, 0)) { + + nPreviousGroupIndex = nGroupIndex - 1; + + } + else { + + nPreviousGroupIndex = aItemGroups.length - 1; + + } + + var aPreviousGroup = + getPreviousArrayItem(aItemGroups, nPreviousGroupIndex); + + oPreviousItem = + getPreviousArrayItem( + aPreviousGroup, + (aPreviousGroup.length - 1) + ); + + } + + return ( + oPreviousItem.cfg.getProperty("disabled") || + oPreviousItem.element.style.display == "none" + ) ? + oPreviousItem.getPreviousEnabledSibling() : oPreviousItem; + + } + + }, + + /** + * @method focus + * @description Causes the menu item to receive the focus and fires the + * focus event. + */ + focus: function() { + + var oParent = this.parent; + var oAnchor = this._oAnchor; + var oActiveItem = oParent.activeItem; + + if( + !this.cfg.getProperty("disabled") && + oParent && + oParent.cfg.getProperty("visible") && + this.element.style.display != "none" + ) { + + if(oActiveItem) { + + oActiveItem.blur(); + + } + + try { + + oAnchor.focus(); + + } + catch(e) { + + } + + this.focusEvent.fire(); + + } + + }, + + /** + * @method blur + * @description Causes the menu item to lose focus and fires the + * onblur event. + */ + blur: function() { + + var oParent = this.parent; + + if( + !this.cfg.getProperty("disabled") && + oParent && + Dom.getStyle(oParent.element, "visibility") == "visible" + ) { + + this._oAnchor.blur(); + + this.blurEvent.fire(); + + } + + }, + + /** + * @method destroy + * @description Removes the menu item's <li> element + * from its parent <ul> element. + */ + destroy: function() { + + var oEl = this.element; + + if(oEl) { + + // Remove CustomEvent listeners + + this.mouseOverEvent.unsubscribeAll(); + this.mouseOutEvent.unsubscribeAll(); + this.mouseDownEvent.unsubscribeAll(); + this.mouseUpEvent.unsubscribeAll(); + this.clickEvent.unsubscribeAll(); + this.keyPressEvent.unsubscribeAll(); + this.keyDownEvent.unsubscribeAll(); + this.keyUpEvent.unsubscribeAll(); + this.focusEvent.unsubscribeAll(); + this.blurEvent.unsubscribeAll(); + this.cfg.configChangedEvent.unsubscribeAll(); + + // Remove the element from the parent node + + var oParentNode = oEl.parentNode; + + if(oParentNode) { + + oParentNode.removeChild(oEl); + + this.destroyEvent.fire(); + + } + + this.destroyEvent.unsubscribeAll(); + + } + + }, + + /** + * @method toString + * @description Returns a string representing the menu item. + * @return {String} + */ + toString: function() { + + return ("MenuItem: " + this.cfg.getProperty("text")); + + } + +}; + +})(); + +/** +* Creates an item for a menu module. +* +* @param {String} p_oObject String specifying the text of the menu module item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu module item. +* @param {HTMLOptGroupElement} p_oObject Object specifying +* the <optgroup> element of the menu module item. +* @param {HTMLOptionElement} p_oObject Object specifying the +* <option> element of the menu module item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu module item. See configuration class documentation +* for more details. +* @class MenuModuleItem +* @constructor +* @deprecated As of version 0.12, all MenuModuleItem functionality has been +* implemented directly in YAHOO.widget.MenuItem, making YAHOO.widget.MenuItem +* the base class for all menu items. +*/ +YAHOO.widget.MenuModuleItem = YAHOO.widget.MenuItem; + +/** +* Creates a list of options or commands which are made visible in response to +* an HTML element's "contextmenu" event ("mousedown" for Opera). +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +* @class ContextMenu +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.ContextMenu = function(p_oElement, p_oConfig) { + + YAHOO.widget.ContextMenu.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + +YAHOO.extend(YAHOO.widget.ContextMenu, YAHOO.widget.Menu, { + +// Private properties + +/** +* @property _oTrigger +* @description Object reference to the current value of the "trigger" +* configuration property. +* @default null +* @private +* @type String|HTMLElement|Array +*/ +_oTrigger: null, + +// Public properties + +/** +* @property contextEventTarget +* @description Object reference for the HTML element that was the target of the +* "contextmenu" DOM event ("mousedown" for Opera) that triggered the display of +* the context menu. +* @default null +* @type HTMLElement +*/ +contextEventTarget: null, + +/** +* @method init +* @description The ContextMenu class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the context menu. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for +* the context menu. +* @param {HTMLDivElement} p_oElement Object specifying the +* <div> element of the context menu. +* @param {HTMLSelectElement} p_oElement Object specifying +* the <select> element to be used as the data source for +* the context menu. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu. See configuration class documentation +* for more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.ContextMenuItem; + + } + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.ContextMenu.superclass.init.call(this, p_oElement); + + this.beforeInitEvent.fire(YAHOO.widget.ContextMenu); + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + + this.initEvent.fire(YAHOO.widget.ContextMenu); + +}, + +// Private methods + +/** +* @method _removeEventHandlers +* @description Removes all of the DOM event handlers from the HTML element(s) +* whose "context menu" event ("click" for Opera) trigger the display of +* the context menu. +* @private +*/ +_removeEventHandlers: function() { + + var Event = YAHOO.util.Event; + var oTrigger = this._oTrigger; + var bOpera = (this.browser == "opera"); + + // Remove the event handlers from the trigger(s) + + Event.removeListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu + ); + + if(bOpera) { + + Event.removeListener(oTrigger, "click", this._onTriggerClick); + + } + +}, + +// Private event handlers + +/** +* @method _onTriggerClick +* @description "click" event handler for the HTML element(s) identified as the +* "trigger" for the context menu. Used to cancel default behaviors in Opera. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerClick: function(p_oEvent, p_oMenu) { + + if(p_oEvent.ctrlKey) { + + YAHOO.util.Event.stopEvent(p_oEvent); + + } + +}, + +/** +* @method _onTriggerContextMenu +* @description "contextmenu" event handler ("mousedown" for Opera) for the HTML +* element(s) that trigger the display of the context menu. +* @private +* @param {Event} p_oEvent Object representing the DOM event object passed back +* by the event utility (YAHOO.util.Event). +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that is handling the event. +*/ +_onTriggerContextMenu: function(p_oEvent, p_oMenu) { + + // Hide any other ContextMenu instances that might be visible + + YAHOO.widget.MenuManager.hideVisible(); + + var Event = YAHOO.util.Event; + var oConfig = this.cfg; + + if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) { + + return; + + } + + this.contextEventTarget = Event.getTarget(p_oEvent); + + // Position and display the context menu + + var nX = Event.getPageX(p_oEvent); + var nY = Event.getPageY(p_oEvent); + + oConfig.applyConfig( { xy:[nX, nY], visible:true } ); + oConfig.fireQueue(); + + /* + Prevent the browser's default context menu from appearing and + stop the propagation of the "contextmenu" event so that + other ContextMenu instances are not displayed. + */ + + Event.stopEvent(p_oEvent); + +}, + +// Public methods + +/** +* @method toString +* @description Returns a string representing the context menu. +* @return {String} +*/ +toString: function() { + + return ("ContextMenu " + this.id); + +}, + +/** +* @method initDefaultConfig +* @description Initializes the class's configurable properties which can be +* changed using the context menu's Config object ("cfg"). +*/ +initDefaultConfig: function() { + + YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this); + + /** + * @config trigger + * @description The HTML element(s) whose "contextmenu" event ("mousedown" + * for Opera) trigger the display of the context menu. Can be a string + * representing the id attribute of the HTML element, an object reference + * for the HTML element, or an array of strings or HTML element references. + * @default null + * @type String|HTMLElement|Array + */ + this.cfg.addProperty("trigger", { handler: this.configTrigger }); + +}, + +/** +* @method destroy +* @description Removes the context menu's <div> element +* (and accompanying child nodes) from the document. +*/ +destroy: function() { + + // Remove the DOM event handlers from the current trigger(s) + + this._removeEventHandlers(); + + + // Continue with the superclass implementation of this method + + YAHOO.widget.ContextMenu.superclass.destroy.call(this); + +}, + +// Public event handlers for configuration properties + +/** +* @method configTrigger +* @description Event handler for when the value of the "trigger" configuration +* property changes. +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context +* menu that fired the event. +*/ +configTrigger: function(p_sType, p_aArgs, p_oMenu) { + + var Event = YAHOO.util.Event; + var oTrigger = p_aArgs[0]; + + if(oTrigger) { + + /* + If there is a current "trigger" - remove the event handlers + from that element(s) before assigning new ones + */ + + if(this._oTrigger) { + + this._removeEventHandlers(); + + } + + this._oTrigger = oTrigger; + + /* + Listen for the "mousedown" event in Opera b/c it does not + support the "contextmenu" event + */ + + var bOpera = (this.browser == "opera"); + + Event.addListener( + oTrigger, + (bOpera ? "mousedown" : "contextmenu"), + this._onTriggerContextMenu, + this, + true + ); + + /* + Assign a "click" event handler to the trigger element(s) for + Opera to prevent default browser behaviors. + */ + + if(bOpera) { + + Event.addListener( + oTrigger, + "click", + this._onTriggerClick, + this, + true + ); + + } + + } + else { + + this._removeEventHandlers(); + + } + +} + +}); // END YAHOO.extend + +/** +* Creates an item for a context menu. +* +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +* @class ContextMenuItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.ContextMenuItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.ContextMenuItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.extend(YAHOO.widget.ContextMenuItem, YAHOO.widget.MenuItem, { + +/** +* @method init +* @description The ContextMenuItem class's initialization method. This method +* is automatically called by the constructor, and sets up all DOM references +* for pre-existing markup, and creates required markup if it is not +* already present. +* @param {String} p_oObject String specifying the text of the context menu item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the context menu item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the context +* menu item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the context menu item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the context menu item. See configuration class +* documentation for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.ContextMenu; + + } + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.ContextMenuItem.superclass.init.call(this, p_oObject); + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + +// Public methods + +/** +* @method toString +* @description Returns a string representing the context menu item. +* @return {String} +*/ +toString: function() { + + return ("MenuBarItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.extend + +/** +* Horizontal collection of items, each of which can contain a submenu. +* +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +* @class Menubar +* @constructor +* @extends YAHOO.widget.Menu +* @namespace YAHOO.widget +*/ +YAHOO.widget.MenuBar = function(p_oElement, p_oConfig) { + + YAHOO.widget.MenuBar.superclass.constructor.call( + this, + p_oElement, + p_oConfig + ); + +}; + +YAHOO.extend(YAHOO.widget.MenuBar, YAHOO.widget.Menu, { + +/** +* @method init +* @description The MenuBar class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oElement String specifying the id attribute of the +* <div> element of the menu bar. +* @param {String} p_oElement String specifying the id attribute of the +* <select> element to be used as the data source for the +* menu bar. +* @param {HTMLDivElement} p_oElement Object specifying +* the <div> element of the menu bar. +* @param {HTMLSelectElement} p_oElement Object +* specifying the <select> element to be used as the data +* source for the menu bar. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar. See configuration class documentation for +* more details. +*/ +init: function(p_oElement, p_oConfig) { + + if(!this.ITEM_TYPE) { + + this.ITEM_TYPE = YAHOO.widget.MenuBarItem; + + } + + // Call the init of the superclass (YAHOO.widget.Menu) + + YAHOO.widget.MenuBar.superclass.init.call(this, p_oElement); + + this.beforeInitEvent.fire(YAHOO.widget.MenuBar); + + if(p_oConfig) { + + this.cfg.applyConfig(p_oConfig, true); + + } + + this.initEvent.fire(YAHOO.widget.MenuBar); + +}, + +// Constants + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the menu +* bar's <div> element. +* @default "yuimenubar" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubar", + +// Protected event handlers + +/** +* @method _onKeyDown +* @description "keydown" Custom Event handler for the menu bar. +* @private +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) { + + var Event = YAHOO.util.Event; + var oEvent = p_aArgs[0]; + var oItem = p_aArgs[1]; + var oItemCfg = oItem.cfg; + var oSubmenu; + + switch(oEvent.keyCode) { + + case 27: // Esc key + + if(this.cfg.getProperty("position") == "dynamic") { + + this.hide(); + + if(this.parent) { + + this.parent.focus(); + + } + + } + else if(this.activeItem) { + + oSubmenu = this.activeItem.cfg.getProperty("submenu"); + + if(oSubmenu && oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + this.activeItem.focus(); + + } + else { + + this.activeItem.cfg.setProperty("selected", false); + this.activeItem.blur(); + + } + + } + + + Event.preventDefault(oEvent); + + break; + + case 37: // Left arrow + case 39: // Right arrow + + if( + oItem == this.activeItem && + !oItemCfg.getProperty("selected") + ) { + + oItemCfg.setProperty("selected", true); + + } + else { + + var oNextItem = (oEvent.keyCode == 37) ? + oItem.getPreviousEnabledSibling() : + oItem.getNextEnabledSibling(); + + if(oNextItem) { + + this.clearActiveItem(); + + oNextItem.cfg.setProperty("selected", true); + + if(this.cfg.getProperty("autosubmenudisplay")) { + + oSubmenu = oNextItem.cfg.getProperty("submenu"); + + if(oSubmenu) { + + oSubmenu.show(); + oSubmenu.activeItem.blur(); + oSubmenu.activeItem = null; + + } + + } + + oNextItem.focus(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + case 40: // Down arrow + + if(this.activeItem != oItem) { + + this.clearActiveItem(); + + oItemCfg.setProperty("selected", true); + oItem.focus(); + + } + + oSubmenu = oItemCfg.getProperty("submenu"); + + if(oSubmenu) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.setInitialSelection(); + oSubmenu.setInitialFocus(); + + } + else { + + oSubmenu.show(); + + } + + } + + Event.preventDefault(oEvent); + + break; + + } + +}, + +/** +* @method _onClick +* @description "click" event handler for the menu bar. +* @protected +* @param {String} p_sType String representing the name of the event that +* was fired. +* @param {Array} p_aArgs Array of arguments sent when the event was fired. +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar +* that fired the event. +*/ +_onClick: function(p_sType, p_aArgs, p_oMenuBar) { + + YAHOO.widget.MenuBar.superclass._onClick.call( + this, + p_sType, + p_aArgs, + p_oMenuBar + ); + + var oItem = p_aArgs[1]; + + if(oItem) { + + var Event = YAHOO.util.Event; + var Dom = YAHOO.util.Dom; + + var oEvent = p_aArgs[0]; + var oTarget = Event.getTarget(oEvent); + + var oActiveItem = this.activeItem; + var oConfig = this.cfg; + + // Hide any other submenus that might be visible + + if(oActiveItem && oActiveItem != oItem) { + + this.clearActiveItem(); + + } + + + // Select and focus the current item + + oItem.cfg.setProperty("selected", true); + oItem.focus(); + + + // Show the submenu for the item + + var oSubmenu = oItem.cfg.getProperty("submenu"); + + if(oSubmenu && oTarget != oItem.submenuIndicator) { + + if(oSubmenu.cfg.getProperty("visible")) { + + oSubmenu.hide(); + + } + else { + + oSubmenu.show(); + + } + + } + + } + +}, + +// Public methods + +/** +* @method toString +* @description Returns a string representing the menu bar. +* @return {String} +*/ +toString: function() { + + return ("MenuBar " + this.id); + +}, + +/** +* @description Initializes the class's configurable properties which can be +* changed using the menu bar's Config object ("cfg"). +* @method initDefaultConfig +*/ +initDefaultConfig: function() { + + YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this); + + var oConfig = this.cfg; + + // Add configuration properties + + /* + Set the default value for the "position" configuration property + to "static" by re-adding the property. + */ + + /** + * @config position + * @description String indicating how a menu bar should be positioned on the + * screen. Possible values are "static" and "dynamic." Static menu bars + * are visible by default and reside in the normal flow of the document + * (CSS position: static). Dynamic menu bars are hidden by default, reside + * out of the normal flow of the document (CSS position: absolute), and can + * overlay other elements on the screen. + * @default static + * @type String + */ + oConfig.addProperty( + "position", + { + value: "static", + handler: this.configPosition, + validator: this._checkPosition, + supercedes: ["visible"] + } + ); + + /* + Set the default value for the "submenualignment" configuration property + to ["tl","bl"] by re-adding the property. + */ + + /** + * @config submenualignment + * @description Array defining how submenus should be aligned to their + * parent menu bar item. The format is: [itemCorner, submenuCorner]. + * @default ["tl","bl"] + * @type Array + */ + oConfig.addProperty("submenualignment", { value: ["tl","bl"] } ); + + /* + Change the default value for the "autosubmenudisplay" configuration + property to "false" by re-adding the property. + */ + + /** + * @config autosubmenudisplay + * @description Boolean indicating if submenus are automatically made + * visible when the user mouses over the menu bar's items. + * @default false + * @type Boolean + */ + oConfig.addProperty( + "autosubmenudisplay", + { value: false, validator: oConfig.checkBoolean } + ); + +} + +}); // END YAHOO.extend + +/** +* Creates an item for a menu bar. +* +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +* @class MenuBarItem +* @constructor +* @extends YAHOO.widget.MenuItem +*/ +YAHOO.widget.MenuBarItem = function(p_oObject, p_oConfig) { + + YAHOO.widget.MenuBarItem.superclass.constructor.call( + this, + p_oObject, + p_oConfig + ); + +}; + +YAHOO.extend(YAHOO.widget.MenuBarItem, YAHOO.widget.MenuItem, { + +/** +* @method init +* @description The MenuBarItem class's initialization method. This method is +* automatically called by the constructor, and sets up all DOM references for +* pre-existing markup, and creates required markup if it is not already present. +* @param {String} p_oObject String specifying the text of the menu bar item. +* @param {HTMLLIElement} p_oObject Object specifying the +* <li> element of the menu bar item. +* @param {HTMLOptGroupElement} p_oObject Object +* specifying the <optgroup> element of the menu bar item. +* @param {HTMLOptionElement} p_oObject Object specifying +* the <option> element of the menu bar item. +* @param {Object} p_oConfig Optional. Object literal specifying the +* configuration for the menu bar item. See configuration class documentation +* for more details. +*/ +init: function(p_oObject, p_oConfig) { + + if(!this.SUBMENU_TYPE) { + + this.SUBMENU_TYPE = YAHOO.widget.Menu; + + } + + /* + Call the init of the superclass (YAHOO.widget.MenuItem) + Note: We don't pass the user config in here yet + because we only want it executed once, at the lowest + subclass level. + */ + + YAHOO.widget.MenuBarItem.superclass.init.call(this, p_oObject); + + var oConfig = this.cfg; + + if(p_oConfig) { + + oConfig.applyConfig(p_oConfig, true); + + } + + oConfig.fireQueue(); + +}, + +// Constants + +/** +* @property CSS_CLASS_NAME +* @description String representing the CSS class(es) to be applied to the +* <li> element of the menu bar item. +* @default "yuimenubaritem" +* @final +* @type String +*/ +CSS_CLASS_NAME: "yuimenubaritem", + +/** +* @property SUBMENU_INDICATOR_IMAGE_PATH +* @description String representing the path to the image to be used for the +* menu bar item's submenu arrow indicator. +* @default "nt/ic/ut/alt1/menuarodwn8_nrm_1.gif" +* @final +* @type String +*/ +SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_nrm_1.gif", + +/** +* @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH +* @description String representing the path to the image to be used for the +* submenu arrow indicator when the menu bar item is selected. +* @default "nt/ic/ut/alt1/menuarodwn8_hov_1.gif" +* @final +* @type String +*/ +SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_hov_1.gif", + +/** +* @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH +* @description String representing the path to the image to be used for the +* submenu arrow indicator when the menu bar item is disabled. +* @default "nt/ic/ut/alt1/menuarodwn8_dim_1.gif" +* @final +* @type String +*/ +DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_dim_1.gif", + +// Public methods + +/** +* @method toString +* @description Returns a string representing the menu bar item. +* @return {String} +*/ +toString: function() { + + return ("MenuBarItem: " + this.cfg.getProperty("text")); + +} + +}); // END YAHOO.extend + diff --git a/frontend/beta/js/YUI/slider.js b/frontend/beta/js/YUI/slider.js new file mode 100644 index 0000000..8d3cd62 --- /dev/null +++ b/frontend/beta/js/YUI/slider.js @@ -0,0 +1,1113 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.12.0 +*/ + +/** + * The Slider component is a UI control that enables the user to adjust + * values in a finite range along one or two axes. Typically, the Slider + * control is used in a web application as a rich, visual replacement + * for an input box that takes a number as input. The Slider control can + * also easily accommodate a second dimension, providing x,y output for + * a selection point chosen from a rectangular region. + * + * @module slider + * @title Slider Widget + * @namespace YAHOO.widget + * @requires yahoo,dom,dragdrop,event + * @optional animation + */ + +/** + * A DragDrop implementation that can be used as a background for a + * slider. It takes a reference to the thumb instance + * so it can delegate some of the events to it. The goal is to make the + * thumb jump to the location on the background when the background is + * clicked. + * + * @class Slider + * @extends YAHOO.util.DragDrop + * @constructor + * @param {String} id The id of the element linked to this instance + * @param {String} sGroup The group of related DragDrop items + * @param {String} sType The type of slider (horiz, vert, region) + */ +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) { + if (sElementId) { + + /** + * The type of the slider (horiz, vert, region) + * @property type + * @type string + */ + this.type = sType; + + this.init(sElementId, sGroup, true); + + //this.removeInvalidHandleType("A"); + + + var self = this; + + /** + * Event the fires when the value of the control changes. If + * the control is animated the event will fire every point + * along the way. + * @event change + * @param {int} new + * @param {int} firstOffset the number of pixels the thumb has moved + * from its start position. Normal horizontal and vertical sliders will only + * have the firstOffset. Regions will have both, the first is the horizontal + * offset, the second the vertical. + * @param {int} secondOffset the y offset for region sliders + */ + this.createEvent("change", this); + + /** + * Event that fires at the end of a slider thumb move. + * @event slideStart + */ + this.createEvent("slideStart", this); + + /** + * Event that fires at the end of a slider thumb move + * @event slideEnd + */ + this.createEvent("slideEnd", this); + + /** + * A YAHOO.widget.SliderThumb instance that we will use to + * reposition the thumb when the background is clicked + * @property thumb + * @type YAHOO.widget.SliderThumb + */ + this.thumb = oThumb; + + // add handler for the handle onchange event + oThumb.onChange = function() { + self.handleThumbChange(); + }; + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * Flag that determines if the thumb will animate when moved + * @property animate + * @type boolean + */ + this.animate = YAHOO.widget.Slider.ANIM_AVAIL; + + /** + * Set to false to disable a background click thumb move + * @property backgroundEnabled + * @type boolean + */ + this.backgroundEnabled = true; + + /** + * Adjustment factor for tick animation, the more ticks, the + * faster the animation (by default) + * @property tickPause + * @type int + */ + this.tickPause = 40; + + /** + * Enables the arrow, home and end keys, defaults to true. + * @property enableKeys + * @type boolean + */ + this.enableKeys = true; + + /** + * Specifies the number of pixels the arrow keys will move the slider. + * Default is 25. + * @property keyIncrement + * @type int + */ + this.keyIncrement = 20; + + /** + * moveComplete is set to true when the slider has moved to its final + * destination. For animated slider, this value can be checked in + * the onChange handler to make it possible to execute logic only + * when the move is complete rather than at all points along the way. + * + * @property moveComplete + * @type Boolean + */ + this.moveComplete = true; + + /** + * If animation is configured, specifies the length of the animation + * in seconds. + * @property animationDuration + * @type int + * @default 0.2 + */ + this.animationDuration = 0.2; + + if (oThumb._isHoriz && oThumb.xTicks && oThumb.xTicks.length) { + this.tickPause = Math.round(360 / oThumb.xTicks.length); + } else if (oThumb.yTicks && oThumb.yTicks.length) { + this.tickPause = Math.round(360 / oThumb.yTicks.length); + } + + + // delegate thumb methods + oThumb.onMouseDown = function () { return self.focus(); }; + //oThumb.b4MouseDown = function () { return self.b4MouseDown(); }; + // oThumb.lock = function() { self.lock(); }; + // oThumb.unlock = function() { self.unlock(); }; + oThumb.onMouseUp = function() { self.thumbMouseUp(); }; + oThumb.onDrag = function() { self.fireEvents(); }; + oThumb.onAvailable = function() { return self.setStartSliderState(); }; + } +}; + +/** + * Factory method for creating a horizontal slider + * @method YAHOO.widget.Slider.getHorizSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a horizontal slider control + */ +YAHOO.widget.Slider.getHorizSlider = + function (sBGElId, sHandleElId, iLeft, iRight, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, + iLeft, iRight, 0, 0, iTickSize), "horiz"); +}; + +/** + * Factory method for creating a vertical slider + * @method YAHOO.widget.Slider.getVertSlider + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a vertical slider control + */ +YAHOO.widget.Slider.getVertSlider = + function (sBGElId, sHandleElId, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, 0, 0, + iUp, iDown, iTickSize), "vert"); +}; + +/** + * Factory method for creating a slider region like the one in the color + * picker example + * @method YAHOO.widget.Slider.getSliderRegion + * @static + * @param {String} sBGElId the id of the slider's background element + * @param {String} sHandleElId the id of the thumb element + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + * @return {Slider} a slider region control + */ +YAHOO.widget.Slider.getSliderRegion = + function (sBGElId, sHandleElId, iLeft, iRight, iUp, iDown, iTickSize) { + return new YAHOO.widget.Slider(sBGElId, sBGElId, + new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, iLeft, iRight, + iUp, iDown, iTickSize), "region"); +}; + +/** + * By default, animation is available if the animation library is detected. + * @property YAHOO.widget.Slider.ANIM_AVAIL + * @static + * @type boolean + */ +YAHOO.widget.Slider.ANIM_AVAIL = true; + +YAHOO.extend(YAHOO.widget.Slider, YAHOO.util.DragDrop, { + + onAvailable: function() { + var Event = YAHOO.util.Event; + Event.on(this.id, "keydown", this.handleKeyDown, this, true); + Event.on(this.id, "keypress", this.handleKeyPress, this, true); + }, + + handleKeyPress: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + var kc = Event.getCharCode(e); + switch (kc) { + case 0x25: // left + case 0x26: // up + case 0x27: // right + case 0x28: // down + case 0x24: // home + case 0x23: // end + Event.preventDefault(e); + break; + default: + } + } + }, + + handleKeyDown: function(e) { + if (this.enableKeys) { + var Event = YAHOO.util.Event; + + var kc = Event.getCharCode(e), t=this.thumb; + var h=this.getXValue(),v=this.getYValue(); + + var horiz = false; + var changeValue = true; + switch (kc) { + + // left + case 0x25: h -= this.keyIncrement; break; + + // up + case 0x26: v -= this.keyIncrement; break; + + // right + case 0x27: h += this.keyIncrement; break; + + // down + case 0x28: v += this.keyIncrement; break; + + // home + case 0x24: h = t.leftConstraint; + v = t.topConstraint; + break; + + // end + case 0x23: h = t.rightConstraint; + v = t.bottomConstraint; + break; + + default: changeValue = false; + } + + if (changeValue) { + if (t._isRegion) { + this.setRegionValue(h, v, true); + } else { + var newVal = (t._isHoriz) ? h : v; + this.setValue(newVal, true); + } + Event.stopEvent(e); + } + + } + }, + + /** + * Initialization that sets up the value offsets once the elements are ready + * @method setSliderStartState + */ + setStartSliderState: function() { + + + this.setThumbCenterPoint(); + + /** + * The basline position of the background element, used + * to determine if the background has moved since the last + * operation. + * @property baselinePos + * @type [int, int] + */ + this.baselinePos = YAHOO.util.Dom.getXY(this.getEl()); + + this.thumb.startOffset = this.thumb.getOffsetFromParent(this.baselinePos); + + if (this.thumb._isRegion) { + if (this.deferredSetRegionValue) { + this.setRegionValue.apply(this, this.deferredSetRegionValue, true); + this.deferredSetRegionValue = null; + } else { + this.setRegionValue(0, 0, true); + } + } else { + if (this.deferredSetValue) { + this.setValue.apply(this, this.deferredSetValue, true); + this.deferredSetValue = null; + } else { + this.setValue(0, true, true); + } + } + }, + + /** + * When the thumb is available, we cache the centerpoint of the element so + * we can position the element correctly when the background is clicked + * @method setThumbCenterPoint + */ + setThumbCenterPoint: function() { + + var el = this.thumb.getEl(); + + if (el) { + /** + * The center of the slider element is stored so we can position + * place it in the correct position when the background is clicked + * @property thumbCenterPoint + * @type {"x": int, "y": int} + */ + this.thumbCenterPoint = { + x: parseInt(el.offsetWidth/2, 10), + y: parseInt(el.offsetHeight/2, 10) + }; + } + + }, + + /** + * Locks the slider, overrides YAHOO.util.DragDrop + * @method lock + */ + lock: function() { + this.thumb.lock(); + this.locked = true; + }, + + /** + * Unlocks the slider, overrides YAHOO.util.DragDrop + * @method unlock + */ + unlock: function() { + this.thumb.unlock(); + this.locked = false; + }, + + /** + * Handles mouseup event on the slider background + * @method thumbMouseUp + * @private + */ + thumbMouseUp: function() { + if (!this.isLocked() && !this.moveComplete) { + this.endMove(); + } + + }, + + /** + * Returns a reference to this slider's thumb + * @method getThumb + * @return {SliderThumb} this slider's thumb + */ + getThumb: function() { + return this.thumb; + }, + + /** + * Try to focus the element when clicked so we can add + * accessibility features + * @method focus + * @private + */ + focus: function() { + + // Focus the background element if possible + var el = this.getEl(); + + if (el.focus) { + try { + el.focus(); + } catch(e) { + // Prevent permission denied unhandled exception in FF that can + // happen when setting focus while another element is handling + // the blur. @TODO this is still writing to the error log + // (unhandled error) in FF1.5 with strict error checking on. + } + } + + this.verifyOffset(); + + if (this.isLocked()) { + return false; + } else { + this.onSlideStart(); + return true; + } + }, + + /** + * Event that fires when the value of the slider has changed + * @method onChange + * @param {int} firstOffset the number of pixels the thumb has moved + * from its start position. Normal horizontal and vertical sliders will only + * have the firstOffset. Regions will have both, the first is the horizontal + * offset, the second the vertical. + * @param {int} secondOffset the y offset for region sliders + * @deprecated use instance.subscribe("change") instead + */ + onChange: function (firstOffset, secondOffset) { + /* override me */ + }, + + /** + * Event that fires when the at the beginning of the slider thumb move + * @method onSlideStart + * @deprecated use instance.subscribe("slideStart") instead + */ + onSlideStart: function () { + /* override me */ + }, + + /** + * Event that fires at the end of a slider thumb move + * @method onSliderEnd + * @deprecated use instance.subscribe("slideEnd") instead + */ + onSlideEnd: function () { + /* override me */ + }, + + /** + * Returns the slider's thumb offset from the start position + * @method getValue + * @return {int} the current value + */ + getValue: function () { + return this.thumb.getValue(); + }, + + /** + * Returns the slider's thumb X offset from the start position + * @method getXValue + * @return {int} the current horizontal offset + */ + getXValue: function () { + return this.thumb.getXValue(); + }, + + /** + * Returns the slider's thumb Y offset from the start position + * @method getYValue + * @return {int} the current vertical offset + */ + getYValue: function () { + return this.thumb.getYValue(); + }, + + /** + * Internal handler for the slider thumb's onChange event + * @method handleThumbChange + * @private + */ + handleThumbChange: function () { + var t = this.thumb; + if (t._isRegion) { + t.onChange(t.getXValue(), t.getYValue()); + this.fireEvent("change", { x: t.getXValue(), y: t.getYValue() } ); + } else { + t.onChange(t.getValue()); + this.fireEvent("change", t.getValue()); + } + + }, + + /** + * Provides a way to set the value of the slider in code. + * @method setValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setValue: function(newOffset, skipAnim, force) { + + if (!this.thumb.available) { + this.deferredSetValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + return false; + } + + if ( isNaN(newOffset) ) { + return false; + } + + var t = this.thumb; + var newX, newY; + this.verifyOffset(); + if (t._isRegion) { + return false; + } else if (t._isHoriz) { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + this.moveThumb(newX, t.initPageY, skipAnim); + } else { + this.onSlideStart(); + // this.fireEvent("slideStart"); + newY = t.initPageY + newOffset + this.thumbCenterPoint.y; + this.moveThumb(t.initPageX, newY, skipAnim); + } + + return true; + }, + + /** + * Provides a way to set the value of the region slider in code. + * @method setRegionValue + * @param {int} newOffset the number of pixels the thumb should be + * positioned away from the initial start point (x axis for region) + * @param {int} newOffset2 the number of pixels the thumb should be + * positioned away from the initial start point (y axis for region) + * @param {boolean} skipAnim set to true to disable the animation + * for this move action (but not others). + * @param {boolean} force ignore the locked setting and set value anyway + * @return {boolean} true if the move was performed, false if it failed + */ + setRegionValue: function(newOffset, newOffset2, skipAnim) { + + if (!this.thumb.available) { + this.deferredSetRegionValue = arguments; + return false; + } + + if (this.isLocked() && !force) { + return false; + } + + if ( isNaN(newOffset) ) { + return false; + } + + var t = this.thumb; + if (t._isRegion) { + this.onSlideStart(); + var newX = t.initPageX + newOffset + this.thumbCenterPoint.x; + var newY = t.initPageY + newOffset2 + this.thumbCenterPoint.y; + this.moveThumb(newX, newY, skipAnim); + return true; + } + + return false; + + }, + + /** + * Checks the background position element position. If it has moved from the + * baseline position, the constraints for the thumb are reset + * @method verifyOffset + * @return {boolean} True if the offset is the same as the baseline. + */ + verifyOffset: function() { + + var newPos = YAHOO.util.Dom.getXY(this.getEl()); + + if (newPos[0] != this.baselinePos[0] || newPos[1] != this.baselinePos[1]) { + this.thumb.resetConstraints(); + this.baselinePos = newPos; + return false; + } + + return true; + }, + + /** + * Move the associated slider moved to a timeout to try to get around the + * mousedown stealing moz does when I move the slider element between the + * cursor and the background during the mouseup event + * @method moveThumb + * @param {int} x the X coordinate of the click + * @param {int} y the Y coordinate of the click + * @param {boolean} skipAnim don't animate if the move happend onDrag + * @private + */ + moveThumb: function(x, y, skipAnim) { + + + var t = this.thumb; + var self = this; + + if (!t.available) { + return; + } + + + // this.verifyOffset(); + + t.setDelta(this.thumbCenterPoint.x, this.thumbCenterPoint.y); + + var _p = t.getTargetCoord(x, y); + var p = [_p.x, _p.y]; + + this.fireEvent("slideStart"); + + if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && t._graduated && !skipAnim) { + // this.thumb._animating = true; + this.lock(); + + setTimeout( function() { self.moveOneTick(p); }, this.tickPause ); + + } else if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && !skipAnim) { + + // this.thumb._animating = true; + this.lock(); + + var oAnim = new YAHOO.util.Motion( + t.id, { points: { to: p } }, + this.animationDuration, + YAHOO.util.Easing.easeOut ); + + oAnim.onComplete.subscribe( function() { self.endMove(); } ); + oAnim.animate(); + } else { + t.setDragElPos(x, y); + // this.fireEvents(); + this.endMove(); + } + }, + + /** + * Move the slider one tick mark towards its final coordinate. Used + * for the animation when tick marks are defined + * @method moveOneTick + * @param {int[]} the destination coordinate + * @private + */ + moveOneTick: function(finalCoord) { + + var t = this.thumb; + var curCoord = YAHOO.util.Dom.getXY(t.getEl()); + var tmp; + + // var thresh = Math.min(t.tickSize + (Math.floor(t.tickSize/2)), 10); + // var thresh = 10; + // var thresh = t.tickSize + (Math.floor(t.tickSize/2)); + + var nextCoord = null; + + if (t._isRegion) { + nextCoord = this._getNextX(curCoord, finalCoord); + var tmpX = (nextCoord) ? nextCoord[0] : curCoord[0]; + nextCoord = this._getNextY([tmpX, curCoord[1]], finalCoord); + + } else if (t._isHoriz) { + nextCoord = this._getNextX(curCoord, finalCoord); + } else { + nextCoord = this._getNextY(curCoord, finalCoord); + } + + + if (nextCoord) { + + // move to the next coord + // YAHOO.util.Dom.setXY(t.getEl(), nextCoord); + + // var el = t.getEl(); + // YAHOO.util.Dom.setStyle(el, "left", (nextCoord[0] + this.thumb.deltaSetXY[0]) + "px"); + // YAHOO.util.Dom.setStyle(el, "top", (nextCoord[1] + this.thumb.deltaSetXY[1]) + "px"); + + this.thumb.alignElWithMouse(t.getEl(), nextCoord[0], nextCoord[1]); + + // check if we are in the final position, if not make a recursive call + if (!(nextCoord[0] == finalCoord[0] && nextCoord[1] == finalCoord[1])) { + var self = this; + setTimeout(function() { self.moveOneTick(finalCoord); }, + this.tickPause); + } else { + this.endMove(); + } + } else { + this.endMove(); + } + + //this.tickPause = Math.round(this.tickPause/2); + }, + + /** + * Returns the next X tick value based on the current coord and the target coord. + * @method _getNextX + * @private + */ + _getNextX: function(curCoord, finalCoord) { + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + if (curCoord[0] > finalCoord[0]) { + thresh = t.tickSize - this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] - thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[0] < finalCoord[0]) { + thresh = t.tickSize + this.thumbCenterPoint.x; + tmp = t.getTargetCoord( curCoord[0] + thresh, curCoord[1] ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Returns the next Y tick value based on the current coord and the target coord. + * @method _getNextY + * @private + */ + _getNextY: function(curCoord, finalCoord) { + var t = this.thumb; + var thresh; + var tmp = []; + var nextCoord = null; + + if (curCoord[1] > finalCoord[1]) { + thresh = t.tickSize - this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] - thresh ); + nextCoord = [tmp.x, tmp.y]; + } else if (curCoord[1] < finalCoord[1]) { + thresh = t.tickSize + this.thumbCenterPoint.y; + tmp = t.getTargetCoord( curCoord[0], curCoord[1] + thresh ); + nextCoord = [tmp.x, tmp.y]; + } else { + // equal, do nothing + } + + return nextCoord; + }, + + /** + * Resets the constraints before moving the thumb. + * @method b4MouseDown + * @private + */ + b4MouseDown: function(e) { + this.thumb.autoOffset(); + this.thumb.resetConstraints(); + }, + + /** + * Handles the mousedown event for the slider background + * @method onMouseDown + * @private + */ + onMouseDown: function(e) { + // this.resetConstraints(true); + // this.thumb.resetConstraints(true); + + if (! this.isLocked() && this.backgroundEnabled) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + + this.focus(); + this.moveThumb(x, y); + } + + }, + + /** + * Handles the onDrag event for the slider background + * @method onDrag + * @private + */ + onDrag: function(e) { + if (! this.isLocked()) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.moveThumb(x, y, true); + } + }, + + /** + * Fired when the slider movement ends + * @method endMove + * @private + */ + endMove: function () { + // this._animating = false; + this.unlock(); + this.moveComplete = true; + this.fireEvents(); + }, + + /** + * Fires the change event if the value has been changed. Ignored if we are in + * the middle of an animation as the event will fire when the animation is + * complete + * @method fireEvents + * @private + */ + fireEvents: function () { + + var t = this.thumb; + + t.cachePosition(); + + if (! this.isLocked()) { + if (t._isRegion) { + var newX = t.getXValue(); + var newY = t.getYValue(); + + if (newX != this.previousX || newY != this.previousY) { + this.onChange(newX, newY); + this.fireEvent("change", { x: newX, y: newY }); + } + + this.previousX = newX; + this.previousY = newY; + + } else { + var newVal = t.getValue(); + if (newVal != this.previousVal) { + this.onChange( newVal ); + this.fireEvent("change", newVal); + } + this.previousVal = newVal; + } + + if (this.moveComplete) { + this.onSlideEnd(); + this.fireEvent("slideEnd"); + this.moveComplete = false; + } + + } + }, + + /** + * Slider toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return ("Slider (" + this.type +") " + this.id); + } + +}); + +YAHOO.augment(YAHOO.widget.Slider, YAHOO.util.EventProvider); + +/** + * A drag and drop implementation to be used as the thumb of a slider. + * @class SliderThumb + * @extends YAHOO.util.DD + * @constructor + * @param {String} id the id of the slider html element + * @param {String} sGroup the group of related DragDrop items + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the element + * should move a certain number pixels at a time. + */ +YAHOO.widget.SliderThumb = function(id, sGroup, iLeft, iRight, iUp, iDown, iTickSize) { + + if (id) { + this.init(id, sGroup); + + /** + * The id of the thumbs parent HTML element (the slider background + * element). + * @property parentElId + * @type string + */ + this.parentElId = sGroup; + } + + //this.removeInvalidHandleType("A"); + + + /** + * Overrides the isTarget property in YAHOO.util.DragDrop + * @property isTarget + * @private + */ + this.isTarget = false; + + /** + * The tick size for this slider + * @property tickSize + * @type int + * @private + */ + this.tickSize = iTickSize; + + /** + * Informs the drag and drop util that the offsets should remain when + * resetting the constraints. This preserves the slider value when + * the constraints are reset + * @property maintainOffset + * @type boolean + * @private + */ + this.maintainOffset = true; + + this.initSlider(iLeft, iRight, iUp, iDown, iTickSize); + + /** + * Turns off the autoscroll feature in drag and drop + * @property scroll + * @private + */ + this.scroll = false; + +}; + +YAHOO.extend(YAHOO.widget.SliderThumb, YAHOO.util.DD, { + + /** + * The (X and Y) difference between the thumb location and its parent + * (the slider background) when the control is instantiated. + * @property startOffset + * @type [int, int] + */ + startOffset: null, + + /** + * Flag used to figure out if this is a horizontal or vertical slider + * @property _isHoriz + * @type boolean + * @private + */ + _isHoriz: false, + + /** + * Cache the last value so we can check for change + * @property _prevVal + * @type int + * @private + */ + _prevVal: 0, + + /** + * The slider is _graduated if there is a tick interval defined + * @property _graduated + * @type boolean + * @private + */ + _graduated: false, + + /** + * Returns the difference between the location of the thumb and its parent. + * @method getOffsetFromParent + * @param {[int, int]} parentPos Optionally accepts the position of the parent + * @type [int, int] + */ + getOffsetFromParent: function(parentPos) { + var myPos = YAHOO.util.Dom.getXY(this.getEl()); + var ppos = parentPos || YAHOO.util.Dom.getXY(this.parentElId); + + return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ]; + }, + + /** + * Set up the slider, must be called in the constructor of all subclasses + * @method initSlider + * @param {int} iLeft the number of pixels the element can move left + * @param {int} iRight the number of pixels the element can move right + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize the width of the tick interval. + */ + initSlider: function (iLeft, iRight, iUp, iDown, iTickSize) { + + this.setXConstraint(iLeft, iRight, iTickSize); + this.setYConstraint(iUp, iDown, iTickSize); + + if (iTickSize && iTickSize > 1) { + this._graduated = true; + } + + this._isHoriz = (iLeft || iRight); + this._isVert = (iUp || iDown); + this._isRegion = (this._isHoriz && this._isVert); + + }, + + /** + * Clear's the slider's ticks + * @method clearTicks + */ + clearTicks: function () { + YAHOO.widget.SliderThumb.superclass.clearTicks.call(this); + this._graduated = false; + }, + + /** + * Gets the current offset from the element's start position in + * pixels. + * @method getValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved from the start position. + */ + getValue: function () { + if (!this.available) { return 0; } + var val = (this._isHoriz) ? this.getXValue() : this.getYValue(); + return val; + }, + + /** + * Gets the current X offset from the element's start position in + * pixels. + * @method getXValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved horizontally from the start position. + */ + getXValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[0] - this.startOffset[0]); + }, + + /** + * Gets the current Y offset from the element's start position in + * pixels. + * @method getYValue + * @return {int} the number of pixels (positive or negative) the + * slider has moved vertically from the start position. + */ + getYValue: function () { + if (!this.available) { return 0; } + var newOffset = this.getOffsetFromParent(); + return (newOffset[1] - this.startOffset[1]); + }, + + /** + * Thumb toString + * @method toString + * @return {string} string representation of the instance + */ + toString: function () { + return "SliderThumb " + this.id; + }, + + /** + * The onchange event for the handle/thumb is delegated to the YAHOO.widget.Slider + * instance it belongs to. + * @method onChange + * @private + */ + onChange: function (x, y) { + } + +}); + +if ("undefined" == typeof YAHOO.util.Anim) { + YAHOO.widget.Slider.ANIM_AVAIL = false; +} + diff --git a/frontend/beta/js/YUI/tabview.js b/frontend/beta/js/YUI/tabview.js new file mode 100644 index 0000000..34a09bb --- /dev/null +++ b/frontend/beta/js/YUI/tabview.js @@ -0,0 +1,1950 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.12.0 +*/ +(function() { + + YAHOO.util.Lang = { + isArray: function(val) { // frames lose type, so test constructor string + if (val.constructor && val.constructor.toString().indexOf('Array') > -1) { + return true; + } else { + return YAHOO.util.Lang.isObject(val) && val.constructor == Array; + } + }, + + isBoolean: function(val) { + return typeof val == 'boolean'; + }, + + isFunction: function(val) { + return typeof val == 'function'; + }, + + isNull: function(val) { + return val === null; + }, + + isNumber: function(val) { + return !isNaN(val); + }, + + isObject: function(val) { + return typeof val == 'object' || YAHOO.util.Lang.isFunction(val); + }, + + isString: function(val) { + return typeof val == 'string'; + }, + + isUndefined: function(val) { + return typeof val == 'undefined'; + } + }; +})();/** + * Provides Attribute configurations. + * @namespace YAHOO.util + * @class Attribute + * @constructor + * @param hash {Object} The intial Attribute. + * @param {YAHOO.util.AttributeProvider} The owner of the Attribute instance. + */ + +YAHOO.util.Attribute = function(hash, owner) { + if (owner) { + this.owner = owner; + this.configure(hash, true); + } +}; + +YAHOO.util.Attribute.prototype = { + /** + * The name of the attribute. + * @property name + * @type String + */ + name: undefined, + + /** + * The value of the attribute. + * @property value + * @type String + */ + value: null, + + /** + * The owner of the attribute. + * @property owner + * @type YAHOO.util.AttributeProvider + */ + owner: null, + + /** + * Whether or not the attribute is read only. + * @property readOnly + * @type Boolean + */ + readOnly: false, + + /** + * Whether or not the attribute can only be written once. + * @property writeOnce + * @type Boolean + */ + writeOnce: false, + + /** + * The attribute's initial configuration. + * @private + * @property _initialConfig + * @type Object + */ + _initialConfig: null, + + /** + * Whether or not the attribute's value has been set. + * @private + * @property _written + * @type Boolean + */ + _written: false, + + /** + * The method to use when setting the attribute's value. + * The method recieves the new value as the only argument. + * @property method + * @type Function + */ + method: null, + + /** + * The validator to use when setting the attribute's value. + * @property validator + * @type Function + * @return Boolean + */ + validator: null, + + /** + * Retrieves the current value of the attribute. + * @method getValue + * @return {any} The current value of the attribute. + */ + getValue: function() { + return this.value; + }, + + /** + * Sets the value of the attribute and fires beforeChange and change events. + * @method setValue + * @param {Any} value The value to apply to the attribute. + * @param {Boolean} silent If true the change events will not be fired. + * @return {Boolean} Whether or not the value was set. + */ + setValue: function(value, silent) { + var beforeRetVal; + var owner = this.owner; + var name = this.name; + + var event = { + type: name, + prevValue: this.getValue(), + newValue: value + }; + + if (this.readOnly || ( this.writeOnce && this._written) ) { + return false; // write not allowed + } + + if (this.validator && !this.validator.call(owner, value) ) { + return false; // invalid value + } + + if (!silent) { + beforeRetVal = owner.fireBeforeChangeEvent(event); + if (beforeRetVal === false) { + YAHOO.log('setValue ' + name + + 'cancelled by beforeChange event', 'info', 'Attribute'); + return false; + } + } + + if (this.method) { + this.method.call(owner, value); + } + + this.value = value; + this._written = true; + + event.type = name; + + if (!silent) { + this.owner.fireChangeEvent(event); + } + + return true; + }, + + /** + * Allows for configuring the Attribute's properties. + * @method configure + * @param {Object} map A key-value map of Attribute properties. + * @param {Boolean} init Whether or not this should become the initial config. + */ + configure: function(map, init) { + map = map || {}; + this._written = false; // reset writeOnce + this._initialConfig = this._initialConfig || {}; + + for (var key in map) { + if ( key && map.hasOwnProperty(key) ) { + this[key] = map[key]; + if (init) { + this._initialConfig[key] = map[key]; + } + } + } + }, + + /** + * Resets the value to the initial config value. + * @method resetValue + * @return {Boolean} Whether or not the value was set. + */ + resetValue: function() { + return this.setValue(this._initialConfig.value); + }, + + /** + * Resets the attribute config to the initial config state. + * @method resetConfig + */ + resetConfig: function() { + this.configure(this._initialConfig); + }, + + /** + * Resets the value to the current value. + * Useful when values may have gotten out of sync with actual properties. + * @method refresh + * @return {Boolean} Whether or not the value was set. + */ + refresh: function(silent) { + this.setValue(this.value, silent); + } +};(function() { + var Lang = YAHOO.util.Lang; + + /* + Copyright (c) 2006, Yahoo! Inc. All rights reserved. + Code licensed under the BSD License: + http://developer.yahoo.net/yui/license.txt + */ + + /** + * Provides and manages YAHOO.util.Attribute instances + * @namespace YAHOO.util + * @class AttributeProvider + * @uses YAHOO.util.EventProvider + */ + YAHOO.util.AttributeProvider = function() {}; + + YAHOO.util.AttributeProvider.prototype = { + + /** + * A key-value map of Attribute configurations + * @property _configs + * @protected (may be used by subclasses and augmentors) + * @private + * @type {Object} + */ + _configs: null, + /** + * Returns the current value of the attribute. + * @method get + * @param {String} key The attribute whose value will be returned. + */ + get: function(key){ + var configs = this._configs || {}; + var config = configs[key]; + + if (!config) { + YAHOO.log(key + ' not found', 'error', 'AttributeProvider'); + return undefined; + } + + return config.value; + }, + + /** + * Sets the value of a config. + * @method set + * @param {String} key The name of the attribute + * @param {Any} value The value to apply to the attribute + * @param {Boolean} silent Whether or not to suppress change events + * @return {Boolean} Whether or not the value was set. + */ + set: function(key, value, silent){ + var configs = this._configs || {}; + var config = configs[key]; + + if (!config) { + YAHOO.log('set failed: ' + key + ' not found', + 'error', 'AttributeProvider'); + return false; + } + + return config.setValue(value, silent); + }, + + /** + * Returns an array of attribute names. + * @method getAttributeKeys + * @return {Array} An array of attribute names. + */ + getAttributeKeys: function(){ + var configs = this._configs; + var keys = []; + var config; + for (var key in configs) { + config = configs[key]; + if ( configs.hasOwnProperty(key) && + !Lang.isUndefined(config) ) { + keys[keys.length] = key; + } + } + + return keys; + }, + + /** + * Sets multiple attribute values. + * @method setAttributes + * @param {Object} map A key-value map of attributes + * @param {Boolean} silent Whether or not to suppress change events + */ + setAttributes: function(map, silent){ + for (var key in map) { + if ( map.hasOwnProperty(key) ) { + this.set(key, map[key], silent); + } + } + }, + + /** + * Resets the specified attribute's value to its initial value. + * @method resetValue + * @param {String} key The name of the attribute + * @param {Boolean} silent Whether or not to suppress change events + * @return {Boolean} Whether or not the value was set + */ + resetValue: function(key, silent){ + var configs = this._configs || {}; + if (configs[key]) { + this.set(key, configs[key]._initialConfig.value, silent); + return true; + } + return false; + }, + + /** + * Sets the attribute's value to its current value. + * @method refresh + * @param {String | Array} key The attribute(s) to refresh + * @param {Boolean} silent Whether or not to suppress change events + */ + refresh: function(key, silent){ + var configs = this._configs; + + key = ( ( Lang.isString(key) ) ? [key] : key ) || + this.getAttributeKeys(); + + for (var i = 0, len = key.length; i < len; ++i) { + if ( // only set if there is a value and not null + configs[key[i]] && + ! Lang.isUndefined(configs[key[i]].value) && + ! Lang.isNull(configs[key[i]].value) ) { + configs[key[i]].refresh(silent); + } + } + }, + + /** + * Adds an Attribute to the AttributeProvider instance. + * @method register + * @param {String} key The attribute's name + * @param {Object} map A key-value map containing the + * attribute's properties. + */ + register: function(key, map) { + this._configs = this._configs || {}; + + if (this._configs[key]) { // dont override + return false; + } + + map.name = key; + this._configs[key] = new YAHOO.util.Attribute(map, this); + return true; + }, + + /** + * Returns the attribute's properties. + * @method getAttributeConfig + * @param {String} key The attribute's name + * @private + * @return {object} A key-value map containing all of the + * attribute's properties. + */ + getAttributeConfig: function(key) { + var configs = this._configs || {}; + var config = configs[key] || {}; + var map = {}; // returning a copy to prevent overrides + + for (key in config) { + if ( config.hasOwnProperty(key) ) { + map[key] = config[key]; + } + } + + return map; + }, + + /** + * Sets or updates an Attribute instance's properties. + * @method configureAttribute + * @param {String} key The attribute's name. + * @param {Object} map A key-value map of attribute properties + * @param {Boolean} init Whether or not this should become the intial config. + */ + configureAttribute: function(key, map, init) { + var configs = this._configs || {}; + + if (!configs[key]) { + YAHOO.log('unable to configure, ' + key + ' not found', + 'error', 'AttributeProvider'); + return false; + } + + configs[key].configure(map, init); + }, + + /** + * Resets an attribute to its intial configuration. + * @method resetAttributeConfig + * @param {String} key The attribute's name. + * @private + */ + resetAttributeConfig: function(key){ + var configs = this._configs || {}; + configs[key].resetConfig(); + }, + + /** + * Fires the attribute's beforeChange event. + * @method fireBeforeChangeEvent + * @param {String} key The attribute's name. + * @param {Obj} e The event object to pass to handlers. + */ + fireBeforeChangeEvent: function(e) { + var type = 'before'; + type += e.type.charAt(0).toUpperCase() + e.type.substr(1) + 'Change'; + e.type = type; + return this.fireEvent(e.type, e); + }, + + /** + * Fires the attribute's change event. + * @method fireChangeEvent + * @param {String} key The attribute's name. + * @param {Obj} e The event object to pass to the handlers. + */ + fireChangeEvent: function(e) { + e.type += 'Change'; + return this.fireEvent(e.type, e); + } + }; + + YAHOO.augment(YAHOO.util.AttributeProvider, YAHOO.util.EventProvider); +})();(function() { +// internal shorthand +var Dom = YAHOO.util.Dom, + Lang = YAHOO.util.Lang, + EventPublisher = YAHOO.util.EventPublisher, + AttributeProvider = YAHOO.util.AttributeProvider; + +/** + * Element provides an interface to an HTMLElement's attributes and common + * methods. Other commonly used attributes are added as well. + * @namespace YAHOO.util + * @class Element + * @uses YAHOO.util.AttributeProvider + * @constructor + * @param el {HTMLElement | String} The html element that + * represents the Element. + * @param {Object} map A key-value map of initial config names and values + */ +YAHOO.util.Element = function(el, map) { + if (arguments.length) { + this.init(el, map); + } +}; + +YAHOO.util.Element.prototype = { + /** + * Dom events supported by the Element instance. + * @property DOM_EVENTS + * @type Object + */ + DOM_EVENTS: null, + + /** + * Wrapper for HTMLElement method. + * @method appendChild + * @param {Boolean} deep Whether or not to do a deep clone + */ + appendChild: function(child) { + child = child.get ? child.get('element') : child; + this.get('element').appendChild(child); + }, + + /** + * Wrapper for HTMLElement method. + * @method getElementsByTagName + * @param {String} tag The tagName to collect + */ + getElementsByTagName: function(tag) { + return this.get('element').getElementsByTagName(tag); + }, + + /** + * Wrapper for HTMLElement method. + * @method hasChildNodes + * @return {Boolean} Whether or not the element has childNodes + */ + hasChildNodes: function() { + return this.get('element').hasChildNodes(); + }, + + /** + * Wrapper for HTMLElement method. + * @method insertBefore + * @param {HTMLElement} element The HTMLElement to insert + * @param {HTMLElement} before The HTMLElement to insert + * the element before. + */ + insertBefore: function(element, before) { + element = element.get ? element.get('element') : element; + before = (before && before.get) ? before.get('element') : before; + + this.get('element').insertBefore(element, before); + }, + + /** + * Wrapper for HTMLElement method. + * @method removeChild + * @param {HTMLElement} child The HTMLElement to remove + */ + removeChild: function(child) { + child = child.get ? child.get('element') : child; + this.get('element').removeChild(child); + return true; + }, + + /** + * Wrapper for HTMLElement method. + * @method replaceChild + * @param {HTMLElement} newNode The HTMLElement to insert + * @param {HTMLElement} oldNode The HTMLElement to replace + */ + replaceChild: function(newNode, oldNode) { + newNode = newNode.get ? newNode.get('element') : newNode; + oldNode = oldNode.get ? oldNode.get('element') : oldNode; + return this.get('element').replaceChild(newNode, oldNode); + }, + + + /** + * Registers Element specific attributes. + * @method initAttributes + * @param {Object} map A key-value map of initial attribute configs + */ + initAttributes: function(map) { + map = map || {}; + var element = Dom.get(map.element) || null; + + /** + * The HTMLElement the Element instance refers to. + * @config element + * @type HTMLElement + */ + this.register('element', { + value: element, + readOnly: true + }); + }, + + /** + * Adds a listener for the given event. These may be DOM or + * customEvent listeners. Any event that is fired via fireEvent + * can be listened for. All handlers receive an event object. + * @method addListener + * @param {String} type The name of the event to listen for + * @param {Function} fn The handler to call when the event fires + * @param {Any} obj A variable to pass to the handler + * @param {Object} scope The object to use for the scope of the handler + */ + addListener: function(type, fn, obj, scope) { + var el = this.get('element'); + var scope = scope || this; + + el = this.get('id') || el; + + if (!this._events[type]) { // create on the fly + if ( this.DOM_EVENTS[type] ) { + YAHOO.util.Event.addListener(el, type, function(e) { + if (e.srcElement && !e.target) { // supplement IE with target + e.target = e.srcElement; + } + this.fireEvent(type, e); + }, obj, scope); + } + + this.createEvent(type, this); + this._events[type] = true; + } + + this.subscribe.apply(this, arguments); // notify via customEvent + }, + + + /** + * Alias for addListener + * @method on + * @param {String} type The name of the event to listen for + * @param {Function} fn The function call when the event fires + * @param {Any} obj A variable to pass to the handler + * @param {Object} scope The object to use for the scope of the handler + */ + on: function() { this.addListener.apply(this, arguments); }, + + + /** + * Remove an event listener + * @method removeListener + * @param {String} type The name of the event to listen for + * @param {Function} fn The function call when the event fires + */ + removeListener: function(type, fn) { + this.unsubscribe.apply(this, arguments); + }, + + /** + * Wrapper for Dom method. + * @method addClass + * @param {String} className The className to add + */ + addClass: function(className) { + Dom.addClass(this.get('element'), className); + }, + + /** + * Wrapper for Dom method. + * @method getElementsByClassName + * @param {String} className The className to collect + * @param {String} tag (optional) The tag to use in + * conjunction with class name + * @return {Array} Array of HTMLElements + */ + getElementsByClassName: function(className, tag) { + return Dom.getElementsByClassName(className, tag, + this.get('element') ); + }, + + /** + * Wrapper for Dom method. + * @method hasClass + * @param {String} className The className to add + * @return {Boolean} Whether or not the element has the class name + */ + hasClass: function(className) { + return Dom.hasClass(this.get('element'), className); + }, + + /** + * Wrapper for Dom method. + * @method removeClass + * @param {String} className The className to remove + */ + removeClass: function(className) { + return Dom.removeClass(this.get('element'), className); + }, + + /** + * Wrapper for Dom method. + * @method replaceClass + * @param {String} oldClassName The className to replace + * @param {String} newClassName The className to add + */ + replaceClass: function(oldClassName, newClassName) { + return Dom.replaceClass(this.get('element'), + oldClassName, newClassName); + }, + + /** + * Wrapper for Dom method. + * @method setStyle + * @param {String} property The style property to set + * @param {String} value The value to apply to the style property + */ + setStyle: function(property, value) { + return Dom.setStyle(this.get('element'), property, value); + }, + + /** + * Wrapper for Dom method. + * @method getStyle + * @param {String} property The style property to retrieve + * @return {String} The current value of the property + */ + getStyle: function(property) { + return Dom.getStyle(this.get('element'), property); + }, + + /** + * Apply any queued set calls. + * @method fireQueue + */ + fireQueue: function() { + var queue = this._queue; + for (var i = 0, len = queue.length; i < len; ++i) { + this[queue[i][0]].apply(this, queue[i][1]); + } + }, + + /** + * Appends the HTMLElement into either the supplied parentNode. + * @method appendTo + * @param {HTMLElement | Element} parentNode The node to append to + * @param {HTMLElement | Element} before An optional node to insert before + */ + appendTo: function(parent, before) { + parent = (parent.get) ? parent.get('element') : Dom.get(parent); + + before = (before && before.get) ? + before.get('element') : Dom.get(before); + var element = this.get('element'); + + var newAddition = !Dom.inDocument(element); + + if (!element) { + YAHOO.log('appendTo failed: element not available', + 'error', 'Element'); + return false; + } + + if (!parent) { + YAHOO.log('appendTo failed: parent not available', + 'error', 'Element'); + return false; + } + + if (element.parent != parent) { + if (before) { + parent.insertBefore(element, before); + } else { + parent.appendChild(element); + } + } + + YAHOO.log(element + 'appended to ' + parent); + + if (!newAddition) { + return false; // note return; no refresh if in document + } + + // if a new addition, refresh HTMLElement any applied attributes + var keys = this.getAttributeKeys(); + + for (var key in keys) { // only refresh HTMLElement attributes + if ( !Lang.isUndefined(element[key]) ) { + this.refresh(key); + } + } + }, + + get: function(key) { + var configs = this._configs || {}; + var el = configs.element; // avoid loop due to 'element' + if (el && !configs[key] && !Lang.isUndefined(el.value[key]) ) { + return el.value[key]; + } + + return AttributeProvider.prototype.get.call(this, key); + }, + + set: function(key, value, silent) { + var el = this.get('element'); + if (!el) { + this._queue[key] = ['set', arguments]; + return false; + } + + // set it on the element if not a property + if ( !this._configs[key] && !Lang.isUndefined(el[key]) ) { + _registerHTMLAttr(this, key); + } + + return AttributeProvider.prototype.set.apply(this, arguments); + }, + + register: function(key) { // protect html attributes + var configs = this._configs || {}; + var element = this.get('element') || null; + + if ( element && !Lang.isUndefined(element[key]) ) { + YAHOO.log(key + ' is reserved for ' + element, + 'error', 'Element'); + return false; + } + + return AttributeProvider.prototype.register.apply(this, arguments); + }, + + configureAttribute: function(property, map, init) { // protect html attributes + if (!this._configs[property] && this._configs.element && + !Lang.isUndefined(this._configs.element[property]) ) { + _registerHTMLAttr(this, property, map); + return false; + } + + return AttributeProvider.prototype.configure.apply(this, arguments); + }, + + getAttributeKeys: function() { + var el = this.get('element'); + var keys = AttributeProvider.prototype.getAttributeKeys.call(this); + + //add any unconfigured element keys + for (var key in el) { + if (!this._configs[key]) { + keys[key] = keys[key] || el[key]; + } + } + + return keys; + }, + + init: function(el, attr) { + this._queue = this._queue || []; + this._events = this._events || {}; + this._configs = this._configs || {}; + attr = attr || {}; + attr.element = attr.element || el || null; + + this.DOM_EVENTS = { + 'click': true, + 'keydown': true, + 'keypress': true, + 'keyup': true, + 'mousedown': true, + 'mousemove': true, + 'mouseout': true, + 'mouseover': true, + 'mouseup': true + }; + + var readyHandler = function() { + this.initAttributes(attr); + + this.setAttributes(attr, true); + this.fireQueue(); + this.fireEvent('contentReady', { + type: 'contentReady', + target: attr.element + }); + }; + + if ( Lang.isString(el) ) { + _registerHTMLAttr(this, 'id', { value: el }); + YAHOO.util.Event.onAvailable(el, function() { + attr.element = Dom.get(el); + this.fireEvent('available', { + type: 'available', + target: attr.element + }); + }, this, true); + + YAHOO.util.Event.onContentReady(el, function() { + readyHandler.call(this); + }, this, true); + } else { + readyHandler.call(this); + } + } +}; + +/** + * Sets the value of the property and fires beforeChange and change events. + * @private + * @method _registerHTMLAttr + * @param {YAHOO.util.Element} element The Element instance to + * register the config to. + * @param {String} key The name of the config to register + * @param {Object} map A key-value map of the config's params + */ +var _registerHTMLAttr = function(self, key, map) { + var el = self.get('element'); + map = map || {}; + map.name = key; + map.method = map.method || function(value) { + el[key] = value; + }; + map.value = map.value || el[key]; + self._configs[key] = new YAHOO.util.Attribute(map, self); +}; + +/** + * Fires when the Element's HTMLElement can be retrieved by Id. + *

See: Element.addListener

+ *

Event fields:
+ * <String> type available
+ * <HTMLElement> + * target the HTMLElement bound to this Element instance
+ *

Usage:
+ * var handler = function(e) {var target = e.target};
+ * myTabs.addListener('available', handler);

+ * @event available + */ + +/** + * Fires when the Element's HTMLElement subtree is rendered. + *

See: Element.addListener

+ *

Event fields:
+ * <String> type contentReady
+ * <HTMLElement> + * target the HTMLElement bound to this Element instance
+ *

Usage:
+ * var handler = function(e) {var target = e.target};
+ * myTabs.addListener('contentReady', handler);

+ * @event contentReady + */ + +YAHOO.augment(YAHOO.util.Element, AttributeProvider); +})();(function() { + var Dom = YAHOO.util.Dom, + Event = YAHOO.util.Event, + Lang = YAHOO.util.Lang; + + /** + * A representation of a Tab's label and content. + * @namespace YAHOO.widget + * @class Tab + * @extends YAHOO.util.Element + * @constructor + * @param element {HTMLElement | String} (optional) The html element that + * represents the TabView. An element will be created if none provided. + * @param {Object} properties A key map of initial properties + */ + Tab = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !Lang.isString(el) && !el.nodeName) { + attr = el; + el = attr.element; + } + + if (!el && !attr.element) { + el = _createTabElement.call(this, attr); + } + + this.loadHandler = { + success: function(o) { + this.set('content', o.responseText); + }, + failure: function(o) { + YAHOO.log('loading failed: ' + o.statusText, + 'error', 'Tab'); + } + }; + + Tab.superclass.constructor.call(this, el, attr); + + this.DOM_EVENTS = {}; // delegating to tabView + }; + + YAHOO.extend(Tab, YAHOO.util.Element); + var proto = Tab.prototype; + + /** + * The default tag name for a Tab's inner element. + * @property LABEL_INNER_TAGNAME + * @type String + * @default "em" + */ + proto.LABEL_TAGNAME = 'em'; + + /** + * The class name applied to active tabs. + * @property ACTIVE_CLASSNAME + * @type String + * @default "on" + */ + proto.ACTIVE_CLASSNAME = 'selected'; + + /** + * The class name applied to disabled tabs. + * @property DISABLED_CLASSNAME + * @type String + * @default "disabled" + */ + proto.DISABLED_CLASSNAME = 'disabled'; + + /** + * The class name applied to dynamic tabs while loading. + * @property LOADING_CLASSNAME + * @type String + * @default "disabled" + */ + proto.LOADING_CLASSNAME = 'loading'; + + /** + * Provides a reference to the connection request object when data is + * loaded dynamically. + * @property dataConnection + * @type Object + */ + proto.dataConnection = null; + + /** + * Object containing success and failure callbacks for loading data. + * @property loadHandler + * @type object + */ + proto.loadHandler = null; + + /** + * Provides a readable name for the tab. + * @method toString + * @return String + */ + proto.toString = function() { + var el = this.get('element'); + var id = el.id || el.tagName; + return "Tab " + id; + }; + + /** + * Registers TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + attr = attr || {}; + Tab.superclass.initAttributes.call(this, attr); + + var el = this.get('element'); + + /** + * The event that triggers the tab's activation. + * @config activationEvent + * @type String + */ + this.register('activationEvent', { + value: attr.activationEvent || 'click' + }); + + /** + * The element that contains the tab's label. + * @config labelEl + * @type HTMLElement + */ + this.register('labelEl', { + value: attr.labelEl || _getlabelEl.call(this), + method: function(value) { + var current = this.get('labelEl'); + + if (current) { + if (current == value) { + return false; // already set + } + + this.replaceChild(value, current); + } else if (el.firstChild) { // ensure label is firstChild by default + this.insertBefore(value, el.firstChild); + } else { + this.appendChild(value); + } + } + }); + + /** + * The tab's label text (or innerHTML). + * @config label + * @type String + */ + this.register('label', { + value: attr.label || _getLabel.call(this), + method: function(value) { + var labelEl = this.get('labelEl'); + if (!labelEl) { // create if needed + this.set('labelEl', _createlabelEl.call(this)); + } + + _setLabel.call(this, value); + } + }); + + /** + * The HTMLElement that contains the tab's content. + * @config contentEl + * @type HTMLElement + */ + this.register('contentEl', { // TODO: apply className? + value: attr.contentEl || document.createElement('div'), + method: function(value) { + var current = this.get('contentEl'); + + if (current) { + if (current == value) { + return false; // already set + } + this.replaceChild(value, current); + } + } + }); + + /** + * The tab's content. + * @config content + * @type String + */ + this.register('content', { + value: attr.content, // TODO: what about existing? + method: function(value) { + this.get('contentEl').innerHTML = value; + } + }); + + var _dataLoaded = false; + + /** + * The tab's data source, used for loading content dynamically. + * @config dataSrc + * @type String + */ + this.register('dataSrc', { + value: attr.dataSrc + }); + + /** + * Whether or not content should be reloaded for every view. + * @config cacheData + * @type Boolean + * @default false + */ + this.register('cacheData', { + value: attr.cacheData || false, + validator: Lang.isBoolean + }); + + /** + * The method to use for the data request. + * @config loadMethod + * @type String + * @default "GET" + */ + this.register('loadMethod', { + value: attr.loadMethod || 'GET', + validator: Lang.isString + }); + + /** + * Whether or not any data has been loaded from the server. + * @config dataLoaded + * @type Boolean + */ + this.register('dataLoaded', { + value: false, + validator: Lang.isBoolean, + writeOnce: true + }); + + /** + * Number if milliseconds before aborting and calling failure handler. + * @config dataTimeout + * @type Number + * @default null + */ + this.register('dataTimeout', { + value: attr.dataTimeout || null, + validator: Lang.isNumber + }); + + /** + * Whether or not the tab is currently active. + * If a dataSrc is set for the tab, the content will be loaded from + * the given source. + * @config active + * @type Boolean + */ + this.register('active', { + value: attr.active || this.hasClass(this.ACTIVE_CLASSNAME), + method: function(value) { + if (value === true) { + this.addClass(this.ACTIVE_CLASSNAME); + this.set('title', 'active'); + } else { + this.removeClass(this.ACTIVE_CLASSNAME); + this.set('title', ''); + } + }, + validator: function(value) { + return Lang.isBoolean(value) && !this.get('disabled') ; + } + }); + + /** + * Whether or not the tab is disabled. + * @config disabled + * @type Boolean + */ + this.register('disabled', { + value: attr.disabled || this.hasClass(this.DISABLED_CLASSNAME), + method: function(value) { + if (value === true) { + Dom.addClass(this.get('element'), this.DISABLED_CLASSNAME); + } else { + Dom.removeClass(this.get('element'), this.DISABLED_CLASSNAME); + } + }, + validator: Lang.isBoolean + }); + + /** + * The href of the tab's anchor element. + * @config href + * @type String + * @default '#' + */ + this.register('href', { + value: attr.href || '#', + method: function(value) { + this.getElementsByTagName('a')[0].href = value; + }, + validator: Lang.isString + }); + + /** + * The Whether or not the tab's content is visible. + * @config contentVisible + * @type Boolean + * @default false + */ + this.register('contentVisible', { + value: attr.contentVisible, + method: function(value) { + if (value == true) { + this.get('contentEl').style.display = 'block'; + + if ( this.get('dataSrc') ) { + // load dynamic content unless already loaded and caching + if ( !this.get('dataLoaded') || !this.get('cacheData') ) { + _dataConnect.call(this); + } + } + } else { + this.get('contentEl').style.display = 'none'; + } + }, + validator: Lang.isBoolean + }); + }; + + var _createTabElement = function(attr) { + var el = document.createElement('li'); + var a = document.createElement('a'); + + a.href = attr.href || '#'; + + el.appendChild(a); + + var label = attr.label || null; + var labelEl = attr.labelEl || null; + + if (labelEl) { // user supplied labelEl + if (!label) { // user supplied label + label = _getLabel.call(this, labelEl); + } + } else { + labelEl = _createlabelEl.call(this); + } + + a.appendChild(labelEl); + + return el; + }; + + var _getlabelEl = function() { + return this.getElementsByTagName(this.LABEL_TAGNAME)[0]; + }; + + var _createlabelEl = function() { + var el = document.createElement(this.LABEL_TAGNAME); + return el; + }; + + var _setLabel = function(label) { + var el = this.get('labelEl'); + el.innerHTML = label; + }; + + var _getLabel = function() { + var label, + el = this.get('labelEl'); + + if (!el) { + return undefined; + } + + return el.innerHTML; + }; + + var _dataConnect = function() { + if (!YAHOO.util.Connect) { + YAHOO.log('YAHOO.util.Connect dependency not met', + 'error', 'Tab'); + return false; + } + + Dom.addClass(this.get('contentEl').parentNode, this.LOADING_CLASSNAME); + + this.dataConnection = YAHOO.util.Connect.asyncRequest( + this.get('loadMethod'), + this.get('dataSrc'), + { + success: function(o) { + this.loadHandler.success.call(this, o); + this.set('dataLoaded', true); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + failure: function(o) { + this.loadHandler.failure.call(this, o); + this.dataConnection = null; + Dom.removeClass(this.get('contentEl').parentNode, + this.LOADING_CLASSNAME); + }, + scope: this, + timeout: this.get('dataTimeout') + } + ); + }; + + YAHOO.widget.Tab = Tab; + + /** + * Fires before the active state is changed. + *

See: Element.addListener

+ *

If handler returns false, the change will be cancelled, and the value will not + * be set.

+ *

Event fields:
+ * <String> type beforeActiveChange
+ * <Boolean> + * prevValue the current value
+ * <Boolean> + * newValue the new value

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('beforeActiveChange', handler);

+ * @event beforeActiveChange + */ + + /** + * Fires after the active state is changed. + *

See: Element.addListener

+ *

Event fields:
+ * <String> type activeChange
+ * <Boolean> + * prevValue the previous value
+ * <Boolean> + * newValue the updated value

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('activeChange', handler);

+ * @event activeChange + */ + + /** + * Fires before the tab label is changed. + *

See: Element.addListener

+ *

If handler returns false, the change will be cancelled, and the value will not + * be set.

+ *

Event fields:
+ * <String> type beforeLabelChange
+ * <String> + * prevValue the current value
+ * <String> + * newValue the new value

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('beforeLabelChange', handler);

+ * @event beforeLabelChange + */ + + /** + * Fires after the tab label is changed. + *

See: Element.addListener

+ *

Event fields:
+ * <String> type labelChange
+ * <String> + * prevValue the previous value
+ * <String> + * newValue the updated value

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('labelChange', handler);

+ * @event labelChange + */ + + /** + * Fires before the tab content is changed. + *

See: Element.addListener

+ *

If handler returns false, the change will be cancelled, and the value will not + * be set.

+ *

Event fields:
+ * <String> type beforeContentChange
+ * <String> + * prevValue the current value
+ * <String> + * newValue the new value

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('beforeContentChange', handler);

+ * @event beforeContentChange + */ + + /** + * Fires after the tab content is changed. + *

See: Element.addListener

+ *

Event fields:
+ * <String> type contentChange
+ * <String> + * prevValue the previous value
+ * <Boolean> + * newValue the updated value

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('contentChange', handler);

+ * @event contentChange + */ +})();(function() { + + /** + * The tabview module provides a widget for managing content bound to tabs. + * @module tabview + * + */ + /** + * A widget to control tabbed views. + * @namespace YAHOO.widget + * @class TabView + * @extends YAHOO.util.Element + * @constructor + * @param {HTMLElement | String | Object} el(optional) The html + * element that represents the TabView, or the attribute object to use. + * An element will be created if none provided. + * @param {Object} attr (optional) A key map of the tabView's + * initial attributes. Ignored if first arg is attributes object. + */ + YAHOO.widget.TabView = function(el, attr) { + attr = attr || {}; + if (arguments.length == 1 && !Lang.isString(el) && !el.nodeName) { + attr = el; // treat first arg as attr object + el = attr.element || null; + } + + if (!el && !attr.element) { // create if we dont have one + el = _createTabViewElement.call(this, attr); + } + YAHOO.widget.TabView.superclass.constructor.call(this, el, attr); + }; + + YAHOO.extend(YAHOO.widget.TabView, YAHOO.util.Element); + + var proto = YAHOO.widget.TabView.prototype; + var Dom = YAHOO.util.Dom; + var Lang = YAHOO.util.Lang; + var Event = YAHOO.util.Event; + var Tab = YAHOO.widget.Tab; + + + /** + * The className to add when building from scratch. + * @property CLASSNAME + * @default "navset" + */ + proto.CLASSNAME = 'yui-navset'; + + /** + * The className of the HTMLElement containing the TabView's tab elements + * to look for when building from existing markup, or to add when building + * from scratch. + * All childNodes of the tab container are treated as Tabs when building + * from existing markup. + * @property TAB_PARENT_CLASSNAME + * @default "nav" + */ + proto.TAB_PARENT_CLASSNAME = 'yui-nav'; + + /** + * The className of the HTMLElement containing the TabView's label elements + * to look for when building from existing markup, or to add when building + * from scratch. + * All childNodes of the content container are treated as content elements when + * building from existing markup. + * @property CONTENT_PARENT_CLASSNAME + * @default "nav-content" + */ + proto.CONTENT_PARENT_CLASSNAME = 'yui-content'; + + proto._tabParent = null; + proto._contentParent = null; + + /** + * Adds a Tab to the TabView instance. + * If no index is specified, the tab is added to the end of the tab list. + * @method addTab + * @param {YAHOO.widget.Tab} tab A Tab instance to add. + * @param {Integer} index The position to add the tab. + * @return void + */ + proto.addTab = function(tab, index) { + var tabs = this.get('tabs'); + if (!tabs) { // not ready yet + this._queue[this._queue.length] = ['addTab', arguments]; + return false; + } + + index = (index === undefined) ? tabs.length : index; + + var before = this.getTab(index); + + var self = this; + var el = this.get('element'); + var tabParent = this._tabParent; + var contentParent = this._contentParent; + + var tabElement = tab.get('element'); + var contentEl = tab.get('contentEl'); + + if ( before ) { + tabParent.insertBefore(tabElement, before.get('element')); + } else { + tabParent.appendChild(tabElement); + } + + if ( contentEl && !Dom.isAncestor(contentParent, contentEl) ) { + contentParent.appendChild(contentEl); + } + + if ( !tab.get('active') ) { + tab.set('contentVisible', false, true); /* hide if not active */ + } else { + this.set('activeTab', tab, true); + + } + + var activate = function(e) { + YAHOO.util.Event.preventDefault(e); + self.set('activeTab', this); + }; + + tab.addListener( tab.get('activationEvent'), activate); + + tab.addListener('activationEventChange', function(e) { + if (e.prevValue != e.newValue) { + tab.removeListener(e.prevValue, activate); + tab.addListener(e.newValue, activate); + } + }); + + tabs.splice(index, 0, tab); + }; + + /** + * Routes childNode events. + * @method DOMEventHandler + * @param {event} e The Dom event that is being handled. + * @return void + */ + proto.DOMEventHandler = function(e) { + var el = this.get('element'); + var target = YAHOO.util.Event.getTarget(e); + var tabParent = this._tabParent; + + if (Dom.isAncestor(tabParent, target) ) { + var tabEl; + var tab = null; + var contentEl; + var tabs = this.get('tabs'); + + for (var i = 0, len = tabs.length; i < len; i++) { + tabEl = tabs[i].get('element'); + contentEl = tabs[i].get('contentEl'); + + if ( target == tabEl || Dom.isAncestor(tabEl, target) ) { + tab = tabs[i]; + break; // note break + } + } + + if (tab) { + tab.fireEvent(e.type, e); + } + } + }; + + /** + * Returns the Tab instance at the specified index. + * @method getTab + * @param {Integer} index The position of the Tab. + * @return YAHOO.widget.Tab + */ + proto.getTab = function(index) { + return this.get('tabs')[index]; + }; + + /** + * Returns the index of given tab. + * @method getTabIndex + * @param {YAHOO.widget.Tab} tab The tab whose index will be returned. + * @return int + */ + proto.getTabIndex = function(tab) { + var index = null; + var tabs = this.get('tabs'); + for (var i = 0, len = tabs.length; i < len; ++i) { + if (tab == tabs[i]) { + index = i; + break; + } + } + + return index; + }; + + /** + * Removes the specified Tab from the TabView. + * @method removeTab + * @param {YAHOO.widget.Tab} item The Tab instance to be removed. + * @return void + */ + proto.removeTab = function(tab) { + var tabCount = this.get('tabs').length; + + var index = this.getTabIndex(tab); + var nextIndex = index + 1; + if ( tab == this.get('activeTab') ) { // select next tab + if (tabCount > 1) { + if (index + 1 == tabCount) { + this.set('activeIndex', index - 1); + } else { + this.set('activeIndex', index + 1); + } + } + } + + this._tabParent.removeChild( tab.get('element') ); + this._contentParent.removeChild( tab.get('contentEl') ); + this._configs.tabs.value.splice(index, 1); + + }; + + /** + * Provides a readable name for the TabView instance. + * @method toString + * @return String + */ + proto.toString = function() { + var name = this.get('id') || this.get('tagName'); + return "TabView " + name; + }; + + /** + * The transiton to use when switching between tabs. + * @method contentTransition + */ + proto.contentTransition = function(newTab, oldTab) { + newTab.set('contentVisible', true); + oldTab.set('contentVisible', false); + }; + + /** + * Registers TabView specific properties. + * @method initAttributes + * @param {Object} attr Hash of initial attributes + */ + proto.initAttributes = function(attr) { + YAHOO.widget.TabView.superclass.initAttributes.call(this, attr); + + if (!attr.orientation) { + attr.orientation = 'top'; + } + + var el = this.get('element'); + + /** + * The Tabs belonging to the TabView instance. + * @config tabs + * @type Array + */ + this.register('tabs', { + value: [], + readOnly: true + }); + + /** + * The container of the tabView's label elements. + * @property _tabParent + * @private + * @type HTMLElement + */ + this._tabParent = + this.getElementsByClassName(this.TAB_PARENT_CLASSNAME, + 'ul' )[0] || _createTabParent.call(this); + + /** + * The container of the tabView's content elements. + * @property _contentParent + * @type HTMLElement + * @private + */ + this._contentParent = + this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME, + 'div')[0] || _createContentParent.call(this); + + /** + * How the Tabs should be oriented relative to the TabView. + * @config orientation + * @type String + * @default "top" + */ + this.register('orientation', { + value: attr.orientation, + method: function(value) { + var current = this.get('orientation'); + this.addClass('yui-navset-' + value); + + if (current != value) { + this.removeClass('yui-navset-' + current); + } + + switch(value) { + case 'bottom': + this.appendChild(this._tabParent); + break; + } + } + }); + + /** + * The index of the tab currently active. + * @config activeIndex + * @type Int + */ + this.register('activeIndex', { + value: attr.activeIndex, + method: function(value) { + this.set('activeTab', this.getTab(value)); + }, + validator: function(value) { + return !this.getTab(value).get('disabled'); // cannot activate if disabled + } + }); + + /** + * The tab currently active. + * @config activeTab + * @type YAHOO.widget.Tab + */ + this.register('activeTab', { + value: attr.activeTab, + method: function(tab) { + var activeTab = this.get('activeTab'); + + if (tab) { + tab.set('active', true); + } + + if (activeTab && activeTab != tab) { + activeTab.set('active', false); + } + + if (activeTab && tab != activeTab) { // no transition if only 1 + this.contentTransition(tab, activeTab); + } else if (tab) { + tab.set('contentVisible', true); + } + }, + validator: function(value) { + return !value.get('disabled'); // cannot activate if disabled + } + }); + + if ( this._tabParent ) { + _initTabs.call(this); + } + + for (var type in this.DOM_EVENTS) { + if ( this.DOM_EVENTS.hasOwnProperty(type) ) { + this.addListener.call(this, type, this.DOMEventHandler); + } + } + }; + + /** + * Creates Tab instances from a collection of HTMLElements. + * @method createTabs + * @private + * @param {Array|HTMLCollection} elements The elements to use for Tabs. + * @return void + */ + var _initTabs = function() { + var tab, + attr, + contentEl; + + var el = this.get('element'); + var tabs = _getChildNodes(this._tabParent); + var contentElements = _getChildNodes(this._contentParent); + + for (var i = 0, len = tabs.length; i < len; ++i) { + attr = {}; + + if (contentElements[i]) { + attr.contentEl = contentElements[i]; + } + + tab = new YAHOO.widget.Tab(tabs[i], attr); + this.addTab(tab); + + if (tab.hasClass(tab.ACTIVE_CLASSNAME) ) { + this._configs.activeTab.value = tab; // dont invoke method + } + } + }; + + var _createTabViewElement = function(attr) { + var el = document.createElement('div'); + + if ( this.CLASSNAME ) { + el.className = this.CLASSNAME; + } + + return el; + }; + + var _createTabParent = function(attr) { + var el = document.createElement('ul'); + + if ( this.TAB_PARENT_CLASSNAME ) { + el.className = this.TAB_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _createContentParent = function(attr) { + var el = document.createElement('div'); + + if ( this.CONTENT_PARENT_CLASSNAME ) { + el.className = this.CONTENT_PARENT_CLASSNAME; + } + + this.get('element').appendChild(el); + + return el; + }; + + var _getChildNodes = function(el) { + var nodes = []; + var childNodes = el.childNodes; + + for (var i = 0, len = childNodes.length; i < len; ++i) { + if (childNodes[i].nodeType == 1) { + nodes[nodes.length] = childNodes[i]; + } + } + + return nodes; + }; + +/** + * Fires before the activeTab is changed. + *

See: Element.addListener

+ *

If handler returns false, the change will be cancelled, and the value will not + * be set.

+ *

Event fields:
+ * <String> type beforeActiveTabChange
+ * <YAHOO.widget.Tab> + * prevValue the currently active tab
+ * <YAHOO.widget.Tab> + * newValue the tab to be made active

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('beforeActiveTabChange', handler);

+ * @event beforeActiveTabChange + */ + +/** + * Fires after the activeTab is changed. + *

See: Element.addListener

+ *

Event fields:
+ * <String> type activeTabChange
+ * <YAHOO.widget.Tab> + * prevValue the formerly active tab
+ * <YAHOO.widget.Tab> + * newValue the new active tab

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('activeTabChange', handler);

+ * @event activeTabChange + */ + +/** + * Fires before the orientation is changed. + *

See: Element.addListener

+ *

If handler returns false, the change will be cancelled, and the value will not + * be set.

+ *

Event fields:
+ * <String> type beforeOrientationChange
+ * <String> + * prevValue the current orientation
+ * <String> + * newValue the new orientation to be applied

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('beforeOrientationChange', handler);

+ * @event beforeOrientationChange + */ + +/** + * Fires after the orientation is changed. + *

See: Element.addListener

+ *

Event fields:
+ * <String> type orientationChange
+ * <String> + * prevValue the former orientation
+ * <String> + * newValue the new orientation

+ *

Usage:
+ * var handler = function(e) {var previous = e.prevValue};
+ * myTabs.addListener('orientationChange', handler);

+ * @event orientationChange + */ +})(); \ No newline at end of file diff --git a/frontend/beta/js/YUI/treeview.js b/frontend/beta/js/YUI/treeview.js new file mode 100644 index 0000000..ea6b6ef --- /dev/null +++ b/frontend/beta/js/YUI/treeview.js @@ -0,0 +1,2182 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.12.0 +*/ + +/** + * The treeview widget is a generic tree building tool. + * @module treeview + * @title TreeView Widget + * @requires yahoo + * @optional animation + * @namespace YAHOO.widget + */ + +/** + * Contains the tree view state data and the root node. + * + * @class TreeView + * @constructor + * @param {string|HTMLElement} id The id of the element, or the element + * itself that the tree will be inserted into. + */ +YAHOO.widget.TreeView = function(id) { + if (id) { this.init(id); } +}; + +YAHOO.widget.TreeView.prototype = { + + /** + * The id of tree container element + * @property id + * @type String + */ + id: null, + + /** + * The host element for this tree + * @property _el + * @private + */ + _el: null, + + /** + * Flat collection of all nodes in this tree + * @property _nodes + * @type Node[] + * @private + */ + _nodes: null, + + /** + * We lock the tree control while waiting for the dynamic loader to return + * @property locked + * @type boolean + */ + locked: false, + + /** + * The animation to use for expanding children, if any + * @property _expandAnim + * @type string + * @private + */ + _expandAnim: null, + + /** + * The animation to use for collapsing children, if any + * @property _collapseAnim + * @type string + * @private + */ + _collapseAnim: null, + + /** + * The current number of animations that are executing + * @property _animCount + * @type int + * @private + */ + _animCount: 0, + + /** + * The maximum number of animations to run at one time. + * @property maxAnim + * @type int + */ + maxAnim: 2, + + /** + * Sets up the animation for expanding children + * @method setExpandAnim + * @param {string} type the type of animation (acceptable values defined + * in YAHOO.widget.TVAnim) + */ + setExpandAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._expandAnim = type; + } + }, + + /** + * Sets up the animation for collapsing children + * @method setCollapseAnim + * @param {string} the type of animation (acceptable values defined in + * YAHOO.widget.TVAnim) + */ + setCollapseAnim: function(type) { + if (YAHOO.widget.TVAnim.isValid(type)) { + this._collapseAnim = type; + } + }, + + /** + * Perform the expand animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateExpand + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateExpand: function(el, node) { + + if (this._expandAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._expandAnim, el, + function() { tree.expandComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "expand" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Perform the collapse animation if configured, or just show the + * element if not configured or too many animations are in progress + * @method animateCollapse + * @param el {HTMLElement} the element to animate + * @param node {YAHOO.util.Node} the node that was expanded + * @return {boolean} true if animation could be invoked, false otherwise + */ + animateCollapse: function(el, node) { + + if (this._collapseAnim && this._animCount < this.maxAnim) { + // this.locked = true; + var tree = this; + var a = YAHOO.widget.TVAnim.getAnim(this._collapseAnim, el, + function() { tree.collapseComplete(node); }); + if (a) { + ++this._animCount; + this.fireEvent("animStart", { + "node": node, + "type": "collapse" + }); + a.animate(); + } + + return true; + } + + return false; + }, + + /** + * Function executed when the expand animation completes + * @method expandComplete + */ + expandComplete: function(node) { + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "expand" + }); + // this.locked = false; + }, + + /** + * Function executed when the collapse animation completes + * @method collapseComplete + */ + collapseComplete: function(node) { + --this._animCount; + this.fireEvent("animComplete", { + "node": node, + "type": "collapse" + }); + // this.locked = false; + }, + + /** + * Initializes the tree + * @method init + * @parm {string|HTMLElement} id the id of the element that will hold the tree + * @private + */ + init: function(id) { + + this.id = id; + + if ("string" !== typeof id) { + this._el = id; + this.id = this.generateId(id); + } + + /** + * When animation is enabled, this event fires when the animation + * starts + * @event animStart + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animStart", this); + + /** + * When animation is enabled, this event fires when the animation + * completes + * @event animComplete + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + * @parm {String} type the type of animation ("expand" or "collapse") + */ + this.createEvent("animComplete", this); + + /** + * Fires when a node is going to be expanded. Return false to stop + * the expand. + * @event collapse + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + */ + this.createEvent("collapse", this); + + /** + * Fires when a node is going to be collapsed. Return false to stop + * the collapse. + * @event expand + * @type CustomEvent + * @param {YAHOO.widget.Node} node the node that is expanding/collapsing + */ + this.createEvent("expand", this); + + this._nodes = []; + + // store a global reference + YAHOO.widget.TreeView.trees[this.id] = this; + + // Set up the root node + this.root = new YAHOO.widget.RootNode(this); + + + }, + + /** + * Renders the tree boilerplate and visible nodes + * @method draw + */ + draw: function() { + var html = this.root.getHtml(); + this.getEl().innerHTML = html; + this.firstDraw = false; + }, + + /** + * Returns the tree's host element + * @method getEl + * @return {HTMLElement} the host element + */ + getEl: function() { + if (! this._el) { + this._el = document.getElementById(this.id); + } + return this._el; + }, + + /** + * Nodes register themselves with the tree instance when they are created. + * @method regNode + * @param node {Node} the node to register + * @private + */ + regNode: function(node) { + this._nodes[node.index] = node; + }, + + /** + * Returns the root node of this tree + * @method getRoot + * @return {Node} the root node + */ + getRoot: function() { + return this.root; + }, + + /** + * Configures this tree to dynamically load all child data + * @method setDynamicLoad + * @param {function} fnDataLoader the function that will be called to get the data + * @param iconMode {int} configures the icon that is displayed when a dynamic + * load node is expanded the first time without children. By default, the + * "collapse" icon will be used. If set to 1, the leaf node icon will be + * displayed. + */ + setDynamicLoad: function(fnDataLoader, iconMode) { + this.root.setDynamicLoad(fnDataLoader, iconMode); + }, + + /** + * Expands all child nodes. Note: this conflicts with the "multiExpand" + * node property. If expand all is called in a tree with nodes that + * do not allow multiple siblings to be displayed, only the last sibling + * will be expanded. + * @method expandAll + */ + expandAll: function() { + if (!this.locked) { + this.root.expandAll(); + } + }, + + /** + * Collapses all expanded child nodes in the entire tree. + * @method collapseAll + */ + collapseAll: function() { + if (!this.locked) { + this.root.collapseAll(); + } + }, + + /** + * Returns a node in the tree that has the specified index (this index + * is created internally, so this function probably will only be used + * in html generated for a given node.) + * @method getNodeByIndex + * @param {int} nodeIndex the index of the node wanted + * @return {Node} the node with index=nodeIndex, null if no match + */ + getNodeByIndex: function(nodeIndex) { + var n = this._nodes[nodeIndex]; + return (n) ? n : null; + }, + + /** + * Returns a node that has a matching property and value in the data + * object that was passed into its constructor. + * @method getNodeByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Node} the matching node, null if no match + */ + getNodeByProperty: function(property, value) { + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + return n; + } + } + + return null; + }, + + /** + * Returns a collection of nodes that have a matching property + * and value in the data object that was passed into its constructor. + * @method getNodesByProperty + * @param {object} property the property to search (usually a string) + * @param {object} value the value we want to find (usuall an int or string) + * @return {Array} the matching collection of nodes, null if no match + */ + getNodesByProperty: function(property, value) { + var values = []; + for (var i in this._nodes) { + var n = this._nodes[i]; + if (n.data && value == n.data[property]) { + values.push(n); + } + } + + return (values.length) ? values : null; + }, + + /** + * Removes the node and its children, and optionally refreshes the + * branch of the tree that was affected. + * @method removeNode + * @param {Node} The node to remove + * @param {boolean} autoRefresh automatically refreshes branch if true + * @return {boolean} False is there was a problem, true otherwise. + */ + removeNode: function(node, autoRefresh) { + + // Don't delete the root node + if (node.isRoot()) { + return false; + } + + // Get the branch that we may need to refresh + var p = node.parent; + if (p.parent) { + p = p.parent; + } + + // Delete the node and its children + this._deleteNode(node); + + // Refresh the parent of the parent + if (autoRefresh && p && p.childrenRendered) { + p.refresh(); + } + + return true; + }, + + /** + * Deletes this nodes child collection, recursively. Also collapses + * the node, and resets the dynamic load flag. The primary use for + * this method is to purge a node and allow it to fetch its data + * dynamically again. + * @method removeChildren + * @param {Node} node the node to purge + */ + removeChildren: function(node) { + while (node.children.length) { + this._deleteNode(node.children[0]); + } + + node.childrenRendered = false; + node.dynamicLoadComplete = false; + if (node.expanded) { + node.collapse(); + } else { + node.updateIcon(); + } + }, + + /** + * Deletes the node and recurses children + * @method _deleteNode + * @private + */ + _deleteNode: function(node) { + // Remove all the child nodes first + this.removeChildren(node); + + // Remove the node from the tree + this.popNode(node); + }, + + /** + * Removes the node from the tree, preserving the child collection + * to make it possible to insert the branch into another part of the + * tree, or another tree. + * @method popNode + * @param {Node} the node to remove + */ + popNode: function(node) { + var p = node.parent; + + // Update the parent's collection of children + var a = []; + + for (var i=0, len=p.children.length;i '; + } + + var f = document.createElement("div"); + var s = f.style; + s.position = "absolute"; + s.top = "-1000px"; + s.left = "-1000px"; + f.innerHTML = sb.join(""); + + document.body.appendChild(f); + + YAHOO.widget.TreeView.removeHandler(window, + "load", YAHOO.widget.TreeView.preload); + +}; + +YAHOO.widget.TreeView.addHandler(window, + "load", YAHOO.widget.TreeView.preload); + +/** + * The base class for all tree nodes. The node's presentation and behavior in + * response to mouse events is handled in Node subclasses. + * @namespace YAHOO.widget + * @class Node + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + * @constructor + */ +YAHOO.widget.Node = function(oData, oParent, expanded) { + if (oData) { this.init(oData, oParent, expanded); } +}; + +YAHOO.widget.Node.prototype = { + + /** + * The index for this instance obtained from global counter in YAHOO.widget.TreeView. + * @property index + * @type int + */ + index: 0, + + /** + * This node's child node collection. + * @property children + * @type Node[] + */ + children: null, + + /** + * Tree instance this node is part of + * @property tree + * @type TreeView + */ + tree: null, + + /** + * The data linked to this node. This can be any object or primitive + * value, and the data can be used in getNodeHtml(). + * @property data + * @type object + */ + data: null, + + /** + * Parent node + * @property parent + * @type Node + */ + parent: null, + + /** + * The depth of this node. We start at -1 for the root node. + * @property depth + * @type int + */ + depth: -1, + + /** + * The href for the node's label. If one is not specified, the href will + * be set so that it toggles the node. + * @property href + * @type string + */ + href: null, + + /** + * The label href target, defaults to current window + * @property target + * @type string + */ + target: "_self", + + /** + * The node's expanded/collapsed state + * @property expanded + * @type boolean + */ + expanded: false, + + /** + * Can multiple children be expanded at once? + * @property multiExpand + * @type boolean + */ + multiExpand: true, + + /** + * Should we render children for a collapsed node? It is possible that the + * implementer will want to render the hidden data... @todo verify that we + * need this, and implement it if we do. + * @property renderHidden + * @type boolean + */ + renderHidden: false, + + /** + * This flag is set to true when the html is generated for this node's + * children, and set to false when new children are added. + * @property childrenRendered + * @type boolean + */ + childrenRendered: false, + + /** + * Dynamically loaded nodes only fetch the data the first time they are + * expanded. This flag is set to true once the data has been fetched. + * @property dynamicLoadComplete + * @type boolean + */ + dynamicLoadComplete: false, + + /** + * This node's previous sibling + * @property previousSibling + * @type Node + */ + previousSibling: null, + + /** + * This node's next sibling + * @property nextSibling + * @type Node + */ + nextSibling: null, + + /** + * We can set the node up to call an external method to get the child + * data dynamically. + * @property _dynLoad + * @type boolean + * @private + */ + _dynLoad: false, + + /** + * Function to execute when we need to get this node's child data. + * @property dataLoader + * @type function + */ + dataLoader: null, + + /** + * This is true for dynamically loading nodes while waiting for the + * callback to return. + * @property isLoading + * @type boolean + */ + isLoading: false, + + /** + * The toggle/branch icon will not show if this is set to false. This + * could be useful if the implementer wants to have the child contain + * extra info about the parent, rather than an actual node. + * @property hasIcon + * @type boolean + */ + hasIcon: true, + + /** + * Used to configure what happens when a dynamic load node is expanded + * and we discover that it does not have children. By default, it is + * treated as if it still could have children (plus/minus icon). Set + * iconMode to have it display like a leaf node instead. + * @property iconMode + * @type int + */ + iconMode: 0, + + /** + * The node type + * @property _type + * @private + */ + _type: "Node", + + /* + spacerPath: "http://us.i1.yimg.com/us.yimg.com/i/space.gif", + expandedText: "Expanded", + collapsedText: "Collapsed", + loadingText: "Loading", + */ + + /** + * Initializes this node, gets some of the properties from the parent + * @method init + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ + init: function(oData, oParent, expanded) { + + this.data = oData; + this.children = []; + this.index = YAHOO.widget.TreeView.nodeCount; + ++YAHOO.widget.TreeView.nodeCount; + this.expanded = expanded; + + /** + * The parentChange event is fired when a parent element is applied + * to the node. This is useful if you need to apply tree-level + * properties to a tree that need to happen if a node is moved from + * one tre to another. + * + * @event parentChange + * @type CustomEvent + */ + this.createEvent("parentChange", this); + + // oParent should never be null except when we create the root node. + if (oParent) { + oParent.appendChild(this); + } + }, + + /** + * Certain properties for the node cannot be set until the parent + * is known. This is called after the node is inserted into a tree. + * the parent is also applied to this node's children in order to + * make it possible to move a branch from one tree to another. + * @method applyParent + * @param {Node} parentNode this node's parent node + * @return {boolean} true if the application was successful + */ + applyParent: function(parentNode) { + if (!parentNode) { + return false; + } + + this.tree = parentNode.tree; + this.parent = parentNode; + this.depth = parentNode.depth + 1; + + if (!this.href) { + this.href = "javascript:" + this.getToggleLink(); + } + + if (! this.multiExpand) { + this.multiExpand = parentNode.multiExpand; + } + + this.tree.regNode(this); + parentNode.childrenRendered = false; + + // cascade update existing children + for (var i=0, len=this.children.length;i 0 || + (checkForLazyLoad && this.isDynamic() && !this.dynamicLoadComplete) ); + }, + + /** + * Expands if node is collapsed, collapses otherwise. + * @method toggle + */ + toggle: function() { + if (!this.tree.locked && ( this.hasChildren(true) || this.isDynamic()) ) { + if (this.expanded) { this.collapse(); } else { this.expand(); } + } + }, + + /** + * Returns the markup for this node and its children. + * @method getHtml + * @return {string} the markup for this node and its expanded children. + */ + getHtml: function() { + + this.childrenRendered = false; + + var sb = []; + sb[sb.length] = '
'; + sb[sb.length] = this.getNodeHtml(); + sb[sb.length] = this.getChildrenHtml(); + sb[sb.length] = '
'; + return sb.join(""); + }, + + /** + * Called when first rendering the tree. We always build the div that will + * contain this nodes children, but we don't render the children themselves + * unless this node is expanded. + * @method getChildrenHtml + * @return {string} the children container div html and any expanded children + * @private + */ + getChildrenHtml: function() { + + var sb = []; + sb[sb.length] = '
= this.depth || depth < 0) { + return null; + } + + var p = this.parent; + + while (p.depth > depth) { + p = p.parent; + } + + return p; + }, + + /** + * Returns the css class for the spacer at the specified depth for + * this node. If this node's ancestor at the specified depth + * has a next sibling the presentation is different than if it + * does not have a next sibling + * @method getDepthStyle + * @param {int} depth the depth of the ancestor. + * @return {string} the css class for the spacer + */ + getDepthStyle: function(depth) { + return (this.getAncestor(depth).nextSibling) ? + "ygtvdepthcell" : "ygtvblankdepthcell"; + }, + + /** + * Get the markup for the node. This is designed to be overrided so that we can + * support different types of nodes. + * @method getNodeHtml + * @return {string} The HTML that will render this node. + */ + getNodeHtml: function() { + return ""; + }, + + /** + * Regenerates the html for this node and its children. To be used when the + * node is expanded and new children have been added. + * @method refresh + */ + refresh: function() { + // this.loadComplete(); + this.getChildrenEl().innerHTML = this.completeRender(); + + if (this.hasIcon) { + var el = this.getToggleEl(); + if (el) { + el.className = this.getStyle(); + } + } + }, + + /** + * Node toString + * @method toString + * @return {string} string representation of the node + */ + toString: function() { + return "Node (" + this.index + ")"; + } + +}; + +YAHOO.augment(YAHOO.widget.Node, YAHOO.util.EventProvider); + +/** + * A custom YAHOO.widget.Node that handles the unique nature of + * the virtual, presentationless root node. + * @namespace YAHOO.widget + * @class RootNode + * @extends YAHOO.widget.Node + * @param oTree {YAHOO.widget.TreeView} The tree instance this node belongs to + * @constructor + */ +YAHOO.widget.RootNode = function(oTree) { + // Initialize the node with null params. The root node is a + // special case where the node has no presentation. So we have + // to alter the standard properties a bit. + this.init(null, null, true); + + /* + * For the root node, we get the tree reference from as a param + * to the constructor instead of from the parent element. + */ + this.tree = oTree; +}; + +YAHOO.extend(YAHOO.widget.RootNode, YAHOO.widget.Node, { + + // overrides YAHOO.widget.Node + getNodeHtml: function() { + return ""; + }, + + toString: function() { + return "RootNode"; + }, + + loadComplete: function() { + this.tree.draw(); + } + +}); +/** + * The default node presentation. The first parameter should be + * either a string that will be used as the node's label, or an object + * that has a string propery called label. By default, the clicking the + * label will toggle the expanded/collapsed state of the node. By + * changing the href property of the instance, this behavior can be + * changed so that the label will go to the specified href. + * @namespace YAHOO.widget + * @class TextNode + * @extends YAHOO.widget.Node + * @constructor + * @param oData {object} a string or object containing the data that will + * be used to render this node + * @param oParent {YAHOO.widget.Node} this node's parent node + * @param expanded {boolean} the initial expanded/collapsed state + */ +YAHOO.widget.TextNode = function(oData, oParent, expanded) { + + if (oData) { + this.init(oData, oParent, expanded); + this.setUpLabel(oData); + } + +}; + +YAHOO.extend(YAHOO.widget.TextNode, YAHOO.widget.Node, { + + /** + * The CSS class for the label href. Defaults to ygtvlabel, but can be + * overridden to provide a custom presentation for a specific node. + * @property labelStyle + * @type string + */ + labelStyle: "ygtvlabel", + + /** + * The derived element id of the label for this node + * @property labelElId + * @type string + */ + labelElId: null, + + /** + * The text for the label. It is assumed that the oData parameter will + * either be a string that will be used as the label, or an object that + * has a property called "label" that we will use. + * @property label + * @type string + */ + label: null, + + textNodeParentChange: function() { + + /** + * Custom event that is fired when the text node label is clicked. The + * custom event is defined on the tree instance, so there is a single + * event that handles all nodes in the tree. The node clicked is + * provided as an argument + * + * @event labelClick + * @for YAHOO.widget.TreeView + * @param {YAHOO.widget.Node} node the node clicked + */ + if (this.tree && !this.tree.hasEvent("labelClick")) { + this.tree.createEvent("labelClick", this.tree); + } + + }, + + /** + * Sets up the node label + * @method setUpLabel + * @param oData string containing the label, or an object with a label property + */ + setUpLabel: function(oData) { + + // set up the custom event on the tree + this.textNodeParentChange(); + this.subscribe("parentChange", this.textNodeParentChange); + + if (typeof oData == "string") { + oData = { label: oData }; + } + this.label = oData.label; + + // update the link + if (oData.href) { + this.href = oData.href; + } + + // set the target + if (oData.target) { + this.target = oData.target; + } + + if (oData.style) { + this.labelStyle = oData.style; + } + + this.labelElId = "ygtvlabelel" + this.index; + }, + + /** + * Returns the label element + * @for YAHOO.widget.TextNode + * @method getLabelEl + * @return {object} the element + */ + getLabelEl: function() { + return document.getElementById(this.labelElId); + }, + + // overrides YAHOO.widget.Node + getNodeHtml: function() { + var sb = []; + + sb[sb.length] = ''; + sb[sb.length] = ''; + + for (var i=0;i '; + } + + var getNode = 'YAHOO.widget.TreeView.getNode(\'' + + this.tree.id + '\',' + this.index + ')'; + + sb[sb.length] = ''; + + /* + sb[sb.length] = ' '; + } + + if (this.hasIcon) { + sb[sb.length] = ' + * YAHOO.namespace("property.package"); + * YAHOO.namespace("YAHOO.property.package"); + * + * Either of the above would create YAHOO.property, then + * YAHOO.property.package + * + * Be careful when naming packages. Reserved words may work in some browsers + * and not others. For instance, the following will fail in Safari: + *
+ * YAHOO.namespace("really.long.nested.namespace");
+ * 
+ * This fails because "long" is a future reserved word in ECMAScript + * + * @method namespace + * @static + * @param {String*} arguments 1-n namespaces to create + * @return {Object} A reference to the last namespace object created + */ +YAHOO.namespace = function() { + var a=arguments, o=null, i, j, d; + for (i=0; i. + +*/ + +/* @override + https://www.example.com/DEVELOPMENT/css/clipperz.css + http://www.example.com/DEVELOPMENT/css/clipperz.css + https://www.clipperz.com/gamma/css/clipperz.css + https://www.example.com/iPHONE/css/clipperz.css +*/ + +/* +Color list: +- login box: + light #ff9955 + dark #ff6622 +- login button: + regular #dd5500 + hover #773311 +- login translations: + box: #cc6622; + not-selected: + color: #ddaa99 + background: #994422 + selected: #772211; + +*/ + +html { + height: 100%; +} + +body { +/* margin-left: 15px; margin-right: 15px;*/ + font-family: Helvetica, Arial, Geneva, sans-serif; + margin: 0px; +/* + min-width: 600px; +*/ + height: 100%; +} + +img.favicon { + height: 16px; + width: 16px; +} + +/* @group Misc */ + +.clear { + clear: both; +} + +.hidden_none { + display: none; + visibility: hidden; +} + +.keepTogether { + display: inline-block; + white-space: nowrap; +} + +body.ext-gecko .keepTogether { + display: -moz-inline-box; +} + +/* @end */ + +/* @group Loading */ + +div#loading { + margin-left: auto; + margin-right: auto; + text-align: center; + margin-top: 60px; + width: 200px; +} + +div#loading img { + border: 0px; +} + +div#loading h5 { + font-size: 16pt; + padding: 0px; + color: #333366; +} + +div#loading h2 { + padding-left: 20px; + color: #ff9200; +} + + +/* @end */ + +/* @group Login page */ + +/* @group Header */ + +div.pageHeader { + background-color: #1f2148; + min-width: 1013px; +} + +div#logoFrame { + padding: 16px 16px 60px 16px; + min-height: 44px; +} + + +div#logoFrame div#logo { + background: url(../images/old/logo.png); + width: 150px; + height: 39px; +} + + +div#loading div#logo { + background: url(../images/old/logo_blue.png); + width: 193px; + height: 58px; + display: block; +} + +h5.clipperzPayoff { + color: white; + font-size: 13pt; + font-weight: normal; + padding-left: 20px; + white-space: nowrap; + margin: 0px; + padding-left: 4px; +} + + +/* @group Misc links */ + +div#miscLinks { + float: right; +} + +div#miscLinks ul { + margin: 12px 0px 0px; + padding: 15px; +} + +div#miscLinks ul li { + display: inline; + margin: 0px; padding: 0px; border: 0px; +} + +div#miscLinks ul li a { +/* + color: #ccccff; +*/ + color: white; + margin: 0px; padding: 0px; border: 0px; + font-weight: normal; + text-decoration: none; + font-size: 12pt; + border-left: 1px solid #45486b; + padding: 15px; + margin: 0px; + min-width: 70px; +} + +div#miscLinks ul li a#donateHeaderLink { + border-left: 0px; +} + +div#miscLinks ul li a:hover { + color: #ff9200; +} + + + +/* @end */ + + +/* @group Features Tabs */ +#featureTabs table { + width: 100%; + padding: 6px; + padding-bottom: 46px; +} + +#featureTabs table tr td { + width: 25%; + vertical-align: top; + font-size: 11pt; + color: white; +} + +#featureTabs table tr td img { + float: left; +} + +#featureTabs table tr td span { + display: block; + padding: 5 10 5 85; +} + +div#featureTabs canvas.featureIcon { + width: 76px; + height: 76px; + display: block; + float: left; + + 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); + + -webkit-border-radius: 38px; + -moz-border-radius: 38px; + border-radius: 38px; +} +/* +div#featureTabs div.featureIcon.storeIcon { + background-image: url(../images/old/home/features/store.png); +} + +div#featureTabs div.featureIcon.protectIcon { + background-image: url(../images/old/home/features/protect.png); +} + +div#featureTabs div.featureIcon.directLoginIcon { + background-image: url(../images/old/home/features/directLogin.png); +} + +div#featureTabs div.featureIcon.shareIcon { + background-image: url(../images/old/home/features/share.png); +} +*/ +/* +./images/home/features/store.png +./images/home/features/protect.png +./images/home/features/directLogin.png +./images/home/features/share.png +*/ + +/* @end */ + +/* @group Feature bullets */ + +div#featurePoints { + min-width: 400px; + padding-left: 20px; + padding-right: 330px; + padding-top: 15px; + padding-bottom: 20px; +} + +div#featurePoints table tbody tr td { + width: 50%; + vertical-align: top; +} + +div#featurePoints table tbody tr td.separator { + width: 1px; + border-left: 1px solid #bebebe; +} + +div#featurePoints div.block { + padding: 10px; + color: #8e8e8e; +} + +div#featurePoints div.block h3 { + font-weight: normal; + font-size: 12pt; + margin: 0px; + padding: 5px 0px; +} + +div#featurePoints div.block ul { + margin: 0px; + margin-left: 20px; + padding: 0px; + list-style-position: outside; + list-style-image: url(../images/old/home/features/bullet.png); +} + +div#featurePoints div.block ul li { + font-size: 10pt; + padding: 3px 0px; +} + +/* @end */ + + + +/* @end */ + +/* @group Login box */ + +div#loginBox { + width: 273px; +/* z-index: 40000; */ + z-index: 19000; + position: relative; + top: -30px; + right: 30px; + float: right; +} + +div#loginBox div.header { + height: 25px; + width: 273px; +/* background-image: url(../images/old/home/box/box_top.png); */ +/* background-color: #fe965f; */ + background-color: #ff9955; + + -webkit-border-top-left-radius: 20px; + -webkit-border-top-right-radius: 20px; + -moz-border-radius-topleft: 20px; + -moz-border-radius-topright: 20px; + border-top-left-radius: 20px; + border-top-right-radius: 20px; +} + +div#loginBox div.body { + background-color: #ff9955; + + 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); + +/* background: url(../images/old/home/box/box_body.png) repeat-x; */ +} + +div#loginBox div.body h3.loading { + margin: 0px; + text-align: center; + padding-top: 60px; + color: white; + font-size: 30pt; + padding-left: 20px; +} + +div#loginBox div.footer { + height: 37px; + width: 273px; +/* background-image: url(../images/old/home/box/box_bottom.png); */ + background-color: #ff6622; + + -webkit-border-bottom-left-radius: 20px; + -webkit-border-bottom-right-radius: 20px; + -moz-border-radius-bottomleft: 20px; + -moz-border-radius-bottomright: 20px; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; +} + +/* @group Login form */ + +div#loginBox h4 { + color: white; + font-size: 16pt; + font-weight: normal; + padding-left: 20px; + margin: 0px; +} + +div#loginBox form.loginForm { + padding: 5px 20px 0px; + margin-bottom: 0px; +} + +div#loginBox form.loginForm label { + color: white; + font-size: 10pt; + display: block; + padding-top: 5px; +} + +div#loginBox form.loginForm input { + width: 230px; + font-size: 14pt; + border: 1px solid #bb4924; + color: #333366; + background-color: white; + padding: 2px 5px; + height: 28px; +} + +div#loginBox form.loginForm label.checkbox { + display: inline; +} + +div#loginBox form.loginForm .checkbox:hover { + cursor: pointer; +} + +div#loginBox form.loginForm input.checkbox { + margin: 10px 8px 0px 0px; + height: auto; + width: auto; + border: 0px; +} + +div#loginBox form.loginForm ul { + list-style-type: none; + padding: 0px; + margin: 0px; +} + +div#loginBox form.loginForm ul li { + display: block; +} + +div#loginBox form.loginForm input.otp { + width: 57px; + display: inline; + padding-left: 0px; + padding-right: 0px; + height: 28px; + font: 8pt monospace; +} + + + +div#loginBox form.loginForm input.submit { + margin: 0px 45px; + width: 140px; + border: 1px solid white; + color: white; + background-color: #dd5500; + padding: 6px; + font-size: 12pt; + height: auto; +} + +div#loginBox form.loginForm input.submit:hover { + background-color: #773311; + color: white; + cursor: pointer; +} + + +/* @group language chooser */ + +div#loginBox form.loginForm div.translations { + margin: 15px -20px; + background-color: #cc6622; +} + +div#loginBox form.loginForm div.translations h4 { + font-size: 9pt; + padding: 6px 20px 0px; +} + +div#loginBox form.loginForm div.translations ul { + margin: 0px; + padding: 5px 10px 10px; + margin-bottom: 15px; +} + +div#loginBox form.loginForm div.translations ul li { + font-size: 8pt; + color: #ddaa99; + display: inline-block; + padding: 2px 4px; + background-color: #994422; + margin: 1px; +} + +body.ext-gecko div#loginBox form.loginForm div.translations ul li { + display: -moz-inline-box; +} + +div#loginBox form.loginForm div.translations ul li.selected { + background-color: #772211; + color: white; +} + +div#loginBox form.loginForm div.translations ul li.selected:hover { + cursor: default; +} + +div#loginBox form.loginForm div.translations ul li:hover { + cursor: pointer; + color: white; +} + +/* @end */ + +/* @end */ + +/* @end */ + +/* @group Create/Look/Offline */ + +div.activeFeatures { + float: left; + margin-left: 20px; + height: 100px; +} + +div.activeFeatures a { + display: inline-block; + + padding-left: 46px; + color: #ff5906; + text-decoration: none; + font-size: 10pt; +} + + +div.activeFeatures .keepTogether a { + padding-left: 0px; +} + +div.activeFeatures a span.payoff { + display: block; + font-size: 13pt; + font-weight: lighter; + color: #9b9689; + margin: 0px; + padding: 0px; +} + +/*body.ext-gecko div.activeFeatures a { + display: -moz-inline-box; +}*/ +div.activeFeatures a:hover span.payoff { + color: #666666; +} + +div.activeFeatures a:hover span.link { +/* font-weight: bold;*/ +} + +div.activeFeatures div.keepTogether div { + display: inline-block; + padding-right: 15px; +} + +/*body.ext-gecko div.activeFeatures div.keepTogether div { + display: -moz-inline-box; +}*/ + +div.activeFeatures div.createAccountLink { + display: inline-block; + width: 282; + height: 65px; +/* background-image: url(../images/old/home/register.png); */ + margin-right: 20px; +} + +/*body.ext-gecko div.activeFeatures div.createAccountLink { + display: -moz-inline-box; +}*/ + +div.activeFeatures a.createAccountLink { + position: relative; + top: -92px; + left: 5px; +} + +div.activeFeatures div.createAccountLink a.createAccountLink span.payoff { + margin-top: 23px; + margin-left: 40px; + font-size: 17pt; + color: #64626c; +} + +div.activeFeatures div.createAccountLink a.createAccountLink span.link { + padding-left: 40px; + padding-right: 50px; + padding-bottom: 10px; + font-size: 12pt; +} + +div.activeFeatures div.createAccountLink:hover { +/* background-image: url(../images/old/home/register_selected.png);*/ +} + +div.activeFeatures div.createAccountLink:hover a.createAccountLink span.payoff { + color: #54535a; +} + +div.activeFeatures div.createAccountLink:hover a.createAccountLink span.link { + color: white; +} + +/* +div.activeFeatures div.screenshotLink { + background: url(../images/old/home/look.png) no-repeat 0 -3px; +} + +div.activeFeatures div.offlineLink { + background: url(../images/old/home/download.png) no-repeat 10px -4px; +} +*/ + +div.createAccountLink canvas { + width: 282px; + height: 93px; +} +div.activeFeatures .keepTogether canvas { + width: 46px; + height: 46px; + vertical-align: bottom; +} + +/* @end */ + + + +/* @end */ + +/* @group Footer */ + +div.pageHeaderAndBody { + height: 100%; +} + +body > div.pageHeaderAndBody { + height: auto; min-height: 100%; +} + +div#pageBody { + min-width: 1013px; + padding-bottom: 90px; +} + + + +div.pageFooter { + margin-top: -90px; + height: 90px; + clear: both; +} + +div.footerWrapper { + clear: both; + padding-top: 10px; +} +div.footerContent { + background-color: #eaebe6; + padding: 20px; + font-size: 8pt; +} + +/*div.pageFooter div.footerContent div.footerStarIcon {*/ +div.pageFooter div.footerContent canvas.footerStarIcon { +/* background-image: url(../images/old/footer/star.png); */ + width: 40px; + height: 40px; + float: left; +} + +div.pageFooter div.footerContent span.copyright { + padding-left: 10px; + color: #a0a0a0; +} + +div.pageFooter div.footerContent a { + padding-left: 50px; + display: block; + color: #888888; + font-weight: bold; + text-decoration: none; +} + +div.pageFooter div.footerContent span.applicationVersion { + padding: 8px; + color: #888888; + background-color: #d2d2d2; + position: relative; + top: -40px; + float: right; +} + + +/* @end */ + +/* @group Javascript Alert */ + +div#javaScriptAlert div.mask { + position: fixed; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + + background-color: black; + z-index:1001; + -moz-opacity: 0.7; + opacity:.70; + filter: alpha(opacity=70); +} + +div#javaScriptAlert div.header { + height: 34px; + width: 468; + background-image: url(../images/old/alert/header.png); +} + +div#javaScriptAlert div.body { + background-image: url(../images/old/alert/body.png); + padding: 0px 20px 10px 20px; +} +/* +div#javaScriptAlert div.body div.alert { + padding-left: 100px; + background: url(../images/old/alert/alert.png) no-repeat; +} +*/ + +/*div#javaScriptAlert div.body img.alert {*/ +div#javaScriptAlert div.body div.alertLogo { + float: left; + background-image: url(../images/old/alert/alert.png); + width: 88px; + height: 88px; +} + +div#javaScriptAlert div.body div.alert { + padding-left: 100px; +} + +div#javaScriptAlert div.footer { + height: 34px; + width: 468; + background-image: url(../images/old/alert/footer.png); +} + + + +div#javaScriptAlert div.message { + position: relative; + top: -150px; + z-index:1002; +/* + left: 100px; + right: 100px; +*/ + margin-left: auto; + margin-right: auto; + max-width: 468px; +} + +div#javaScriptAlert div.message h1 { + font-size: 16pt; + margin: 0px; + color: #ff5930; +} + +div#javaScriptAlert div.message p { + margin-top: 0px; + color: #999999; +} + +div#javaScriptAlert div.message h3 { + font-size: 12pt; + margin-bottom: 0px; + color: #ff5930; +} + +div#javaScriptAlert div.message h5 { + margin: 0px; + color: #999999; +} + +/* @end */ + +/* @group Components + */ + + +/* @group LoginProgress */ + +div.LoginProgress { + position: relative; + left: -190px; + top: -100px; + width: 380px; + height: 200px; +/* background: url(../images/old/loginProgress/background.png); */ + background-color: #d7d7c0; + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; + + -webkit-box-shadow: 5px 5px 7px rgba(0,0,0,0.6); + -moz-box-shadow: 5px 5px 7px rgba(0,0,0,0.6); + box-shadow: 5px 5px 7px rgba(0,0,0,0.6); +} + +div.LoginProgress div.header { + height: 40px; +} + +div.LoginProgress div.header h3 { + font-size: 12pt; + font-weight: normal; + margin: 0px; + color: #777777; + padding-top: 13px; + padding-left: 18px; +} + +div.LoginProgress div.body { + height: 120px; + overflow: auto; + padding-left: 20px; + padding-right: 20px; + + background-color: #f1f1e9; +/* + margin-left: 19px; + margin-right: 18px; +*/ +} + +div.LoginProgress div.body div.img { + margin: 10px; + width: 50px; + height: 50px; + float: left; +} + +div.LoginProgress div.body div.img.ALERT { +/* background-image: url(../images/old/simpleMessageBox/Alert.png); */ + 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); + -webkit-border-radius: 25px; + -moz-border-radius: 25px; + border-radius: 25px; + +} + +div.LoginProgress div.body div.img.ALERT canvas { + width: 50px; + height: 50px; +/* background-image: url(../images/old/simpleMessageBox/excalmationPoint.png); */ +} + +div.LoginProgress div.body div.loadingBar { + position: relative; + top: 51px; + left: 60px; +} + +div.LoginProgress div.body div.errorBox p { + color: #787872; + padding-top: 20px; + padding-left: 80px; +} + +div.LoginProgress div.footer { + margin-left: 19px; + margin-right: 18px; +} + +div.LoginProgress div.footer a { + text-decoration: none; + text-align: center; + color: #787872; + display: block; + font-weight: bold; + font-size: 11pt; + width: 100px; + margin-top: 11px; + margin-left: auto; + margin-right: auto; +} + +div.LoginProgress div.footer div.button.default { + text-decoration: underline; +} + +div.LoginProgress div.buttonArea { + text-align: center; +} + +div.LoginProgress div.button { + display: inline-block; +} + +div.LoginProgress div.footer a:hover { + color: #515247; +} + + + +/* @end */ + +/* @group SimpleMessagePanel */ + +div.SimpleMessagePanel { + position: relative; + left: -225px; + top: -70px; + width: 450px; + height: 140px; +/* + background: url(../images/old/loginProgress/background.png); +*/ +} + +div.SimpleMessagePanel div.header { + height: 17px; + background: url(../images/old/simpleMessageBox/background_header.png) no-repeat; +} + +div.SimpleMessagePanel div.body { +/* + height: 120px; + overflow: auto; + margin-left: 19px; + margin-right: 18px; +*/ + background: url(../images/old/simpleMessageBox/background_body.png) repeat-y; + padding-left: 25px; + padding-right: 25px; + padding-top: 10px; +} + +div.SimpleMessagePanel div.body h3 { + font-size: 14pt; + font-weight: normal; + margin: 0px; + padding-top: 4px; + color: #787872; +} + +div.SimpleMessagePanel div.body div.img { + width: 66px; + height: 60px; + float: left; +} + +div.SimpleMessagePanel div.body p { + margin: 0; + font-size: 10pt; + font-weight: normal; + color: #787872; + padding-top: 10px; + padding-bottom: 5px; + line-height: 1.3; +} + +div.SimpleMessagePanel div.body div.img.ALERT { + background: url(../images/old/simpleMessageBox/Alert.png) no-repeat; +} + +div.SimpleMessagePanel div.body div.img.INFO { + background: url(../images/old/simpleMessageBox/Info.png) no-repeat; +} + +div.SimpleMessagePanel div.body div.buttonArea { + height: 40px; + clear: both; +} + +div.SimpleMessagePanel div.body div.buttonArea > div { + float: right; + margin-left: 15px; + margin-top: 10px; +} + +div.SimpleMessagePanel div.footer { + height: 25px; + background: url(../images/old/simpleMessageBox/background_footer.png) no-repeat; +} + +div.SimpleMessagePanel div.passphrase { + padding-left: 65px; +} + +div.SimpleMessagePanel div.passphrase input { + width: 250px; + font-size: 14pt; + border: 1px solid #bb4924; + color: #333366; + background-color: white; + padding: 2px 5px; + height: 28px; +} + +div.SimpleMessagePanel div.progressBarWrapper { + margin-left: 80px; +} + +/* @end */ + +/* @group Button */ + +div.button_wrapper { + height: 32px; + background: url(../images/old/button/default_left.png) no-repeat; + cursor: pointer; +} + +div.button_wrapper.hover { + background: url(../images/old/button/hover_left.png) no-repeat; +} + +div.button_wrapper.clicked { + background: url(../images/old/button/clicked_left.png) no-repeat; +} + +div.button_bodyWrapper { + height: 32px; + margin-left: 6px; + padding-right: 6px; + background: url(../images/old/button/default_main.png) repeat-x right 0; +} + +div.button_wrapper.hover div.button_bodyWrapper { + background: url(../images/old/button/hover_main.png) repeat-x right 0; +} + +div.button_wrapper.clicked div.button_bodyWrapper { + background: url(../images/old/button/clicked_main.png) repeat-x right 0; +} + +div.button_body { + text-align: center; + min-width: 60px; + padding: 0px 7px; + padding-top: 8px; +} + +div.button_body span { + font-size: 11pt; + color: white; +} + +div.button_wrapper.default div.button_body span { + font-weight: bold; +} + +/* +div.button_footer { + margin: 0px; + height: 31px; + width: 6px; + background: green url(../images/old/button/default_right.png) no-repeat; +} +*/ +/* @end */ + +/* @group Password enthropy */ + +input.entropyLevelIndicator { + background: url(../images/old/passwordField/background.png) no-repeat 0 26px; +} + +div.passwordEntropyWrapper { + padding: 0px; + border: 1px solid #bb4924; + border-top: 0px; + margin-bottom: 4px; + background-color: white; + margin-right: 3px; + margin-top: -2; +} + +div.passwordEntropy { + height: 4px; + font-size: 1pt; + background: url(../images/old/entropyBackground.gif) repeat-x 0 0; + line-height: 3px; +} + + + +/* @end */ + + + +/* @end */ + +/* @group Main page */ + +/* @group User Info Box */ + +div.userInfoBox { + position: absolute; + width: 160px; + height: 120px; + + top: 100px; + left: 15px; +/* background-image: url(../images/old/main/userInfoBackground.png); */ + + background-color: #ff9955; + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9a56), to(#ff6723), color-stop(1,#333333)); + background: -moz-linear-gradient(0% 100% 90deg,#ff6723, #ff9a56); + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + -webkit-box-shadow: 2px 2px 9px rgba(0,0,0,0.6); + -moz-box-shadow: 2px 2px 9px rgba(0,0,0,0.6); + box-shadow: 2px 2px 9px rgba(0,0,0,0.6); + + color: white; +} + +div.userInfoBox div.body { + padding: 0px 12px; +} + +div.userInfoBox div.header { + height: 30px; +} + +div.userInfoBox div.header h1 { + font-size: 8pt; + font-weight: normal; + margin: 0px; + padding-top: 12px; + padding-left: 12px; +} + +div.userInfoBox div.header a.lockButton { + position: absolute; + top: 8px; + right: 12px; + display: block; + width: 15px; + height: 20px; + text-decoration: none; + background: url(../images/old/lock/unlocked.png) no-repeat -5px -2px; +} + +div.userInfoBox div.header a.lockButton:hover { + background: url(../images/old/lock/unlocked_hover.png) no-repeat -5px -2px; +} + +div.userInfoBox.locked { + z-index:19001; +} + +div.modalDialogMask.userInfoBoxMask { + -moz-opacity: 0.0; + opacity: .0; + filter: alpha(opacity=0); + z-index:19000; +} + +div.userInfoBox.locked div.header a.lockButton { + background: url(../images/old/lock/locked.png) no-repeat -5px -2px; +} + +div.userInfoBox.locked div.header a.lockButton:hover { + background: url(../images/old/lock/locked_hover.png) no-repeat -5px -2px; +} + +div.userInfoBox div.body h3 { + font-size: 11pt; + font-weight: bold; + margin: 0px; +} + +div.userInfoBox div.body ul { + /* ##### */ + list-style-image: url(../images/old/main/userInfoBullet.png); + font-size: 8pt; + padding: 0px; + margin: 4px 0px; + list-style-position: inside; + text-shadow: #000000 0 0 0; +} + +div.userInfoBox div.body ul li span.number { + font-weight: bold; + padding-right: 3px; +} + +div.userInfoBox div.body a { + display: block; + margin-top: 8 + px; + border-top: 1px solid white; + padding-top: 6px; + font-size: 10pt; + font-weight: bold; + color: #d15a22; + text-decoration: none; + border-color: #fe9a5f; +} + +div.userInfoBox div.body a:hover { + color: #8c3b15; +} + +div.userInfoBox.locked div.body a { + display: none; +} + +/* @end */ + + +/* @group Message Box */ + +div.messageBox { + position: absolute; + width: 409px; + height: 29px; + top: 23px; + left: 204px; + background: url(../images/old/main/messageBoxBackground.png); +} + +div.messageBox h3 { + display: inline-block; + color: #342f6b; + font-weight: bold; + margin: 7px 2px 0px 12px; + font-size: 10pt; + +} + +body.ext-gecko div.messageBox h3 { + display: -moz-inline-box; +} + +div.messageBox h1 { + color: #342f6b; + display: inline; + font-weight: normal; + margin: 0px 1px; + font-size: 9pt; +} + +div.messageBox a { + display: block; + width: 20px; + height: 20px; + float: right; + position: absolute; + right: 5px; + top: 4px; + background-image: url(../images/old/main/messageBoxCloseButton.png); +} + +div.messageBox a:hover { + background-image: url(../images/old/main/messageBoxCloseButtonActive.png); +} + +/* @end */ + +/* @group Side panels */ + +div.sidePanels { +/* + position: relative; + top: 110px; +*/ + float: left; + margin-top: 106px; + margin-left: 20px; + width: 160px; + +} + +/* @group Tab Side Panel */ + +div.tabSidePanel { + margin-right: -10px; +/* + position: absolute; + width: 250px; + height: 250px; + top: 250px; + left: 10px; +*/ +} + +div.tabSidePanel ul { + margin: 0px; + padding-left: 0px; + list-style-type: none; + color: #f78b46; +} + +/* @group Main tabs */ + +div.tabSidePanel ul.mainTabs { + margin: 0px; +} + +div.tabSidePanel ul.mainTabs li { +/* margin-bottom: 6px;*/ +} + +div.tabSidePanel ul.mainTabs li a { + display: block; + line-height: 30px; + height: 43px; + padding-left: 40px; + color: #ff6621; + margin: 0px; + font-weight: normal; + font-size: 13pt; + text-decoration: none; +} + +div.tabSidePanel ul.mainTabs li div.selectionHighlighter { + display: none; +} + +div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter { + display: block; + position: absolute; + left: 154px; + margin-top: -43px; +} + +/* +div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter div.selectionHighlighterIcon { + background-image: url(../images/main/tabs/selectionHighligher.png); + width: 50px; + height: 34px; + float: left; + z-index: 35000; + border: 1px solid red; +} +*/ + +div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add { + font-size: 14pt; + font-weight: bold; + position: relative; + top: -34px; + right: 16px; + background: none; + color: #c0531b; + padding-left: 15px; +} + +div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add:hover { + color: white; +} + +div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add span { + font-size: 8pt; + vertical-align: middle; +} + +div.tabSidePanel ul.mainTabs li.selected div.selectionHighlighter a.add h3 { + display: inline; + padding-left: 5px; +} + +div.tabSidePanel ul.mainTabs li.cards.selected a { + margin-left: -10px; + padding-left: 50px; + color: white; + background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px; +} + +div.tabSidePanel ul.mainTabs li.cards.selected a:hover { + background: url(../images/old/main/tabs/cardsBackground.png) -9px -14px; +} + +div.tabSidePanel ul.mainTabs li.cards a { + background: url(../images/old/main/tabs/cardsBackground.png) -19px -63px; +} + +div.tabSidePanel ul.mainTabs li.cards a:hover { + background: url(../images/old/main/tabs/cardsBackground.png) -19px -110px; +} + + + +div.tabSidePanel ul.mainTabs li.directLogins.selected a { + margin-left: -10px; + padding-left: 50px; + color: white; +/* background: url(../images/old/main/tabs/directLoginBackground.png) 0 -1px; */ + background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px; +} + +div.tabSidePanel ul.mainTabs li.directLogins.selected a:hover { + color: white; +/* background: url(../images/old/main/tabs/directLoginBackground.png) 0 -1px; */ + background: url(../images/old/main/tabs/directLoginBackground.png) -9px -14px; +} + +div.tabSidePanel ul.mainTabs li.directLogins a { +/* background: url(../images/old/main/tabs/directLoginBackground.png) 0 -34px; */ + background: url(../images/old/main/tabs/directLoginBackground.png) -19px -63px; +} + +div.tabSidePanel ul.mainTabs li.directLogins a:hover { +/* background: url(../images/old/main/tabs/directLoginBackground.png) 0 -67px; */ + background: url(../images/old/main/tabs/directLoginBackground.png) -19px -110px; +} + + + + + +/* @end */ + +/* @group Other tabs */ + +div.tabSidePanel ul.otherTabs { + margin: 10px 0px; +} + +div.tabSidePanel ul.otherTabs li { + margin-top: -4px; +} + +div.tabSidePanel ul.otherTabs li div.selectionHighlighter { + display: none; +} + +div.tabSidePanel ul.otherTabs li.selected div.selectionHighlighter { + display: block; + position: absolute; + left: 154px; + margin-top: -42px; +} + +div.tabSidePanel ul.otherTabs a { + display: block; + line-height: 36px; + height: 43px; + padding-left: 40px; + color: #ff6621; + text-decoration: none; +/* background: url(../images/old/main/tabs/itemsBackground.png) -10px -49px; */ +} + +div.tabSidePanel ul.otherTabs li.selected a { +/* background: url(../images/old/main/tabs/itemsBackground.png) 0 -1px; */ +/* background: url(../images/old/main/tabs/itemsBackground.png) 0 -67px; */ + margin-left: -10px; + padding-left: 50px; + background: url(../images/old/main/tabs/itemsBackground.png) 1px -96px; + color: white; +} + +div.tabSidePanel ul.otherTabs a:hover { +/* background: url(../images/old/main/tabs/itemsBackground.png) 0 -34px; */ + background: url(../images/old/main/tabs/itemsBackground.png) -10px -49px; +} + +/* @end */ + +/* @end */ + +/* @group Tag Side Panel */ + +div.tagSidePanel { +/* + position: relative; + width: 250px; + min-height: 100px; + left: 10px; +*/ + + margin-right: -8px; +} + +div.tagSidePanel div.header { + height: 50px; + background-image: url(../images/old/main/tabs/tagsBackground.png); +} + +div.tagSidePanel div.header h1 { + padding-left: 52px; + padding-top: 14px; + font-size: 14pt; + font-weight: normal; + color: #888888; +} + +div.tagSidePanel div.body { + background: url(../images/old/main/tabs/tagsBackground.png) -255px; +} + +div.tagSidePanel div.footer { + height: 10px; + background: url(../images/old/main/tabs/tagsBackground.png) -510px -40px; +} + +div.tagSidePanel ul.tags { + margin: 0px; + list-style-type: none; + padding: 0px; +} + +div.tagSidePanel ul.tags li a { + display: block; + font-size: 9pt; + text-decoration: none; + color: #ff6621; + padding: 0px 4px 0px 15px; + line-height: 20px; +} + +div.tagSidePanel ul.tags li a:hover { + background-color: #dddddd; +} + +div.tagSidePanel ul.tags li.selected a:hover { +} + +div.tagSidePanel ul.tags li span.tagCardinality { + float: right; + font-size: 8pt; + color: #999999; + margin-right: 15px; + margin-top: -17px; +} + +div.tagSidePanel ul.tags li.selected a { + background-color: #d4d5cf; +} + +div.tagSidePanel ul.tags li.selected a:hover { + background-color: #d4d5cf; +} + +div.tagSidePanel ul.tags li.selected a { + font-weight: bold; +} + +/* @end */ + + +/* @group Group Side Panel */ + +div.groupSidePanel { + margin-right: -10px; +/* + position: relative; + width: 250px; + min-height: 100px; + left: 10px; +*/ +} + +div.groupSidePanel div.header { + height: 50px; + background-image: url(../images/old/main/tabs/groupsBackground.png); +} + +div.groupSidePanel div.header h1 { + padding-left: 52px; + padding-top: 14px; + font-size: 14pt; + font-weight: normal; + color: white; +} + +div.groupSidePanel div.header a { + float: right; + margin-top: -30px; + margin-right: 20px; + text-decoration: none; + color: #666666; + font-size: 9pt; + line-height: 18px; +} + +div.groupSidePanel div.header a:hover { + color: #444444; +} + +div.groupSidePanel div.body { + background: url(../images/old/main/tabs/groupsBackground.png) -255px; +} + +div.groupSidePanel div.footer { + height: 10px; + background: url(../images/old/main/tabs/groupsBackground.png) -510px -39px; +} + + + +div.groupSidePanel ul.groups { + margin: 0px; + list-style-type: none; + padding: 0px; +} + +div.groupSidePanel ul.groups li a { + display: block; + font-size: 9pt; + text-decoration: none; + color: white; + padding: 0px 4px 0px 15px; + line-height: 20px; +} + +div.groupSidePanel ul.groups li a:hover { + background-color: #aaaaaa; +} + +div.groupSidePanel ul.groups li.selected a:hover { +} + +div.groupSidePanel ul.groups li span.groupCardinality { + float: right; + font-size: 8pt; + color: #dddddd; + margin-right: 15px; + margin-top: -17px; +} + +div.groupSidePanel ul.groups li.selected a { + background-color: #bbbbbb; +} + +div.groupSidePanel ul.groups li.selected a:hover { + background-color: #bbbbbb; +} + +div.groupSidePanel ul.groups li.selected a { + font-weight: bold; +} + +/* @end */ + + + +/* @end */ + +/* @group MainPanels */ + +div.mainPanels { + float: left; + width: 833px; + margin-top: -38px; +/* + position: relative; + width: 100%; + min-height: 600px; + top: -40px; + left: 250px; +*/ +} + +div.mainFooter { + clear: both; +} + +/* @end */ + +/* @group Grids */ + +/* @group grid Component */ + +/* @group delete */ + +div.gridComponent table.rows tbody tr td.delete { +} + +/*div.body div.rows table.rows tbody tr td.delete */ +div.delete, +div.new { + padding-left: 5px; + height: 19px; +} + +div.new span, +div.delete span { + margin: 0px; + padding: 0px; + border: 0px; + display: inline-block; + height: 19px; + padding-right: 6px; +} + +div.new span a, +div.delete span a { + white-space: nowrap; +} + +div.delete:hover { + background: url(../images/old/delete_background_left.png) no-repeat 0; +} +div.delete:hover span { + background: url(../images/old/delete_background.png) no-repeat right 0; +} + +div.new:hover { + background: url(../images/old/new_background_left.png) no-repeat 0; +} +div.new:hover span { + background: url(../images/old/new_background.png) no-repeat right 0; +} + +/* +tr.selected div.delete { + background: url(../images/old/delete_background_left.png) no-repeat 0; +} +tr.selected div.delete span { + background: url(../images/old/delete_background.png) no-repeat right 0; +} +*/ +div.body div.rows table.rows tbody tr td.delete div.delete span a { + visibility: hidden; + font-size: 8pt; + vertical-align: -13px; + color: black; +} + +div.body div.rows table.rows tbody tr.selected td.delete div.delete span a { + visibility: visible; +} + +div.body div.rows table.rows tbody tr:hover td.delete div.delete span a { + visibility: visible; +} + +div.body div.rows table.rows tbody tr:hover td.delete div.delete:hover span a { + color: white; +} +/* +div.body div.rows table.rows tbody tr.selected td.delete div.delete span a { + color: white; +} +*/ +/* @end */ + +/* @group header */ + +div.gridComponent table.rows thead tr th { + text-align: left; + height: 30px; + vertical-align: bottom; +} + +div.gridComponent table.rows thead tr th.sortable span { + cursor: pointer; +} + +div.gridComponent table.rows thead tr th.sortable span a { + margin-left: 5px; + padding-left: 10px; +} + +div.gridComponent table.rows thead tr th.directLoginTH { + width: 420px; +} + +div.gridComponent table.rows thead tr th.latestUpdateTH { + width: 100px; +} + +div.gridComponent table.rows thead tr th.commandsTH { + width: 150px; +} + +div.gridComponent table.rows thead a { + text-decoration: none; +} + +div.gridComponent table.rows thead span { + font-weight: normal; + font-size: 9pt; + line-height: 20px; +} + +div.gridComponent div.header div.headerSlot { + float: right; +} + +/* @end */ + +div.mainPanels div.gridComponent div.body table.rows td.favicon { + padding-left: 25px; +} + +div.mainPanels div.gridComponent div.body table.rows td.favicon img { + width: 16px; + height: 16px; + border: 0px; +} + + + +/* @end */ + +/* @group Card Grid */ + +/* @group DirectLogin links */ + +div.gridComponent th.directLoginTH span { + margin-left: 7px; +} + +td.card_directLogins div { + display: inline-table; +} + +td.card_directLogins span { + display: inline-block; +} +/* +td.card_directLogins a { + display: inline-table; + height: 19px; + + padding-right: 7px; +} + +td.card_directLogins a:hover { + background: url(../images/old/directLink_background.png) right 0; +} +*/ + +div.card_directLogin { + display: inline-block; + height: 19px; + padding-left: 7px; +} + +div.card_directLogin_ellipses span { + padding-bottom: 2px; +} + +div.card_directLogin div.card_directLogin_body { + display: inline-block; + height: 19px; + padding-right: 8px; + background-position: left; +} + +div.card_directLogin div.card_directLogin_body a{ + vertical-align: -14px; +} + +/*div.card_directLogin:hover {*/ +div.card_directLogin:hover { + background: url(../images/old/directLink_background_left.png) no-repeat 0 0; +} + +/*div.card_directLogin:hover div {*/ +div.card_directLogin:hover div.card_directLogin_body { + background: url(../images/old/directLink_background.png) right 0; +} + +/* @group DirectLogin Popup */ + +div.DirectLoginListPopup { + position: absolute; + width: 184px; +} + +div.DirectLoginListPopup div.DirectLoginListPopup_body { + background-image: url(../images/old/directLogins_background.png); + padding-top: 8px; +} + +div.DirectLoginListPopup div.DirectLoginListPopup_footer { + height: 8px; + background-image: url(../images/old/directLogins_background_bottom.png); +} + +div.DirectLoginListPopup div.DirectLoginListPopup_body ul { + margin: 0px; + padding-left: 13px; + list-style: none; +} + +div.DirectLoginListPopup div.DirectLoginListPopup_body ul li { + padding-top: 4px; + height: 20px; + padding-right: 10px; + white-space: nowrap; +} + +div.DirectLoginListPopup div.DirectLoginListPopup_body ul li div { + padding-right: 10px; + overflow: hidden; +} +div.DirectLoginListPopup div.DirectLoginListPopup_body ul li img.favicon { + padding-left: 9px; + padding-right: 5px; +} + +div.DirectLoginListPopup div.DirectLoginListPopup_body ul li a { + text-decoration: none; + color: white; + font-weight: normal; + font-size: 10pt; + vertical-align: 3px; + white-space: nowrap; + padding-right:8px; +} + +div.DirectLoginListPopup div.DirectLoginListPopup_body ul li:hover { +/* background-color: #a5a696; */ +/* background-color: #7b7d70; */ + background-color: rgba(123,125,112,0.5); +} + +div.DirectLoginListPopup div.DirectLoginListPopup_body ul li:hover a { + background: url(../images/old/directLink_no_background.png) right; +} + +/* @end */ + + +/* @end */ + +div.mainPanels div.gridComponent div.header { +/* + height: 90px; + background: url(../images/old/main/blocks/cardGridBackground.png) no-repeat; +*/ + background: url(../images/old/main/blocks/cardGridBackground.png) no-repeat; + padding-left: 40px; + padding-right: 40px; + padding-top: 20px; + padding-bottom: 10px; +} + +div.mainPanels div.gridComponent div.header form.search { + height: 32px; + margin: 0px; +} + +div.mainPanels div.gridComponent div.header form.search div.clearSearchButton { + position: absolute; + margin-left: 192px; + width: 22px; + height: 22px; + margin-top: 6px; + background: url(../images/old/filter/clearFilter_notSelected.png) no-repeat; +} + +div.mainPanels div.gridComponent div.header form.search div.clearSearchButton:hover { + background: url(../images/old/filter/clearFilter_selected.png) no-repeat; + cursor: pointer; +} + +div.mainPanels div.gridComponent div.header form.search div.search { + display: block; + float: left; + width: 217px; +} + +div.mainPanels div.gridComponent div.header form.search input.search { + border: 1px solid #76786a; + color: #666666; + font-size: 12pt; + width: 100%; + padding: 4px; + padding-left: 24px; + padding-right: 26px; + background: #e8ecde url(../images/old/main/grid/search.png) no-repeat 2px 4px; +} + +div.mainPanels div.gridComponent div.header form.search input.search.disabled { + disabled:disabled; +} + +div.mainPanels div.gridComponent div.header form.search input.search.running { + background: #e8ecde url(../images/old/main/grid/running_search.gif) no-repeat 4px 5px; +} + +div.mainPanels div.gridComponent div.body { + clear: both; + background: url(../images/old/main/blocks/cardGridBackground.png) repeat-y -836px; +} + +div.mainPanels div.gridComponent div.footer { + background: url(../images/old/main/blocks/cardGridBackground.png) 834px -28px; + height: 35px; +} + +div.mainPanels div.gridComponent div.body h1 { + margin: 0px; +} + +div.mainPanels div.gridComponent div.body div.rows { + margin-left: 9px; + margin-right: 6px; + min-height: 582px; + background: url(../images/old/main/blocks/cardGridStripes.png) 0 7px; +} + +div.mainPanels div.gridComponent.noRows div.body table.rows thead, +div.mainPanels div.gridComponent.empty div.body table.rows thead { + visibility: hidden; +} + +div.mainPanels div.gridComponent.empty div.body div.rows { + background: #eaebe6 url(../images/old/lock/background_star.png) no-repeat center center; +} + +div.mainPanels div.gridComponent.noRows div.body div.rows { + background: #eaebe6; +} + +div.mainPanels div.gridComponent div.body table.rows { + display: block; + width: 100%; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr.odd.selected { + background-color: #a5a696; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr.even.selected { + background-color: #a5a696; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr.selected td a { + color: #f3f4eb; +} + + +div.mainPanels div.gridComponent div.body table.rows tbody tr.odd { + background-color: #d4d5cf; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr.even { + background-color: #eaebe6; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr.odd:hover { + background-color: #a5a696; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr.even:hover { + background-color: #a5a696; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr td { + height: 23px; + max-height: 23px; +/* + white-space: nowrap; + overflow: hidden; +*/ +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr td span { + color: #828479; + font-size: 10pt; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr td a { + color: #828479; + font-size: 10pt; + text-decoration: none; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr:hover td span { + color: #f3f4eb; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr.selected td span { + color: #f3f4eb; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr:hover td a { + color: #f3f4eb; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr td.title a { + font-weight: bold; +} + +div.mainPanels div.gridComponent div.body table.rows tbody tr td img.favicon { + float: right; + padding-right: 6px; +} + +/* @group header */ + +div.gridComponent table.rows thead img { + padding-left: 10px; + vertical-align: middle; +} + +div.gridComponent table.rows thead tr th { + background-color: #eaebe6; + border-bottom: 1px solid #b3b4af; +} + +div.gridComponent table.rows thead span { + color: #8c8f7e; +} + +div.gridComponent table.rows thead tr th.unsorted span.sortable a { + background-image: url(../images/old/main/grid/unsorted.png); +} + +div.gridComponent table.rows thead tr th.descending span.sortable a { + background-image: url(../images/old/main/grid/descending.png); +} + +div.gridComponent table.rows thead tr th.ascending span.sortable a { + background-image: url(../images/old/main/grid/ascending.png); +} + +div.gridComponent table.rows thead tr th.faviconTH { + width: 53px; +} + +div.gridComponent table.rows thead tr th.titleTH { + width: 200px; + max-width: 200px; +} + +div.gridComponent table.rows thead tr th.deleteTH { + width: 50px; +} + + +/* @end */ + + +/* @end */ + +/* @group Direct login Grid */ +/* +div.mainPanels div.directLoginGrid div.header { +/* + height: 90px; + background: url(../images/old/main/blocks/cardGridBackground.png) no-repeat; +* / +} + +div.mainPanels div.directLoginGrid div.header form.search { + background: url(../images/old/main/blocks/directLoginGridBackground.png) no-repeat; + padding-left: 40px; + padding-top: 20px; + padding-bottom: 10px; + margin: 0px; +} + +div.mainPanels div.directLoginGrid div.header form.search input.search { + border: 1px solid #76786a; + color: #666666; + font-size: 12pt; + padding: 4px; + background-color: #e8ecde; +} + +div.mainPanels div.directLoginGrid div.header form.search input.searchButton { + background-color: #858877; + border: 0px; + color: white; + font-size: 10pt; +} + +div.mainPanels div.directLoginGrid div.body { + background: url(../images/old/main/blocks/directLoginGridBackground.png) repeat-y -836px; +} + +div.mainPanels div.directLoginGrid div.footer { + background: url(../images/old/main/blocks/directLoginGridBackground.png) 834px -28px; + height: 35px; +} + +div.mainPanels div.directLoginGrid div.body h1 { + margin: 0px; +} + +div.mainPanels div.directLoginGrid div.body div.rows { + margin-left: 9px; + margin-right: 6px; + min-height: 582px; + background: url(../images/old/main/blocks/directLoginGridStripes.png) 0 7px; +} + +div.mainPanels div.directLoginGrid div.body table.rows { + display: block; + width: 100%; +} + +div.mainPanels div.directLoginGrid div.body table.rows img { + border: 0px; +} + +div.mainPanels div.directLoginGrid div.body table.rows tbody tr.even { + background-color: #787666; +} + +div.mainPanels div.directLoginGrid div.body table.rows tbody tr.odd { + background-color: #646351; +} + +div.mainPanels div.directLoginGrid div.body table.rows tbody tr.odd:hover { + background-color: #d1d4c6; +} + +div.mainPanels div.directLoginGrid div.body table.rows tbody tr.even:hover { + background-color: #d1d4c6; +} + +div.mainPanels div.directLoginGrid div.body table.rows tbody tr td { + height: 23px; + color: #e1e0d6; + font-size: 10pt; +} + +div.mainPanels div.directLoginGrid div.body table.rows tbody tr:hover td { + color: #777867; +} + +div.mainPanels div.directLoginGrid div.body table.rows tbody tr td.title { + font-weight: bold; +} + +div.directLoginGrid div.body table.rows tbody tr a { + color: #e1e0d6; + text-decoration: none; +} + +div.directLoginGrid div.body table.rows tbody tr:hover a { + color: #777867; +} +*/ + +/* @group DirectLogin links */ +/* +td.card_directLogins div { + display: inline-table; +} + +td.card_directLogins span { + display: inline-table; +} +*/ +div.directLogin_directLogin { + display: inline-block; + height: 19px; + padding-left: 7px; +} + +div.directLogin_directLogin div.directLogin_directLogin_body { + display: inline-block; + height: 19px; + padding-right: 8px; + background-position: left; +} + +div.directLogin_directLogin div.directLogin_directLogin_body a { + vertical-align: -14px; +} + +div.directLogin_directLogin:hover { + background: url(../images/old/directLink_background_left.png) no-repeat 0 0; +} + +div.directLogin_directLogin:hover div.directLogin_directLogin_body { + background: url(../images/old/directLink_background.png) right 0; +} + +table.rows tbody tr td div.directLogin_directLogin:hover div.directLogin_directLogin_body a { + color: #f3f4eb; +} + + + +/* @end */ + + + +/* @group header */ + +div.directLoginGrid table.rows thead span { + color: #e1e0d6; +} + +div.directLoginGrid table.rows thead tr th { + background-color: #787762; + border-bottom: 1px solid #999883; +} + +div.directLoginGrid table.rows thead tr th.faviconTH { + min-width: 53px; + width: 53px; +} + +div.directLoginGrid table.rows thead tr th.titleTH { + min-width: 250px; + width: 250px; +} + +div.directLoginGrid table.rows thead tr th.titleTH span { + margin-left: 7px; +} + +div.directLoginGrid table.rows thead tr th.strengthTH { + width: 100px; +} + +div.directLoginGrid table.rows thead tr th.cardTitleTH { + width: 400px; +} + +div.directLoginGrid table.rows thead tr th.bookmarkableLinkTH { + width: 64px; +} + +div.directLoginGrid table.rows thead tr th.deleteTH { + width: 50px; +} + +div.directLoginGrid table.rows thead tr th.latestAccessTH { + width: 100px; +} + +div.directLoginGrid table.rows thead tr th.commandsTH { + width: 100px; +} +/* +div.directLoginGrid table.rows thead a { + font-weight: normal; + text-decoration: none; + color: #e9e9df; + font-size: 9pt; + line-height: 20px; +} +*/ +div.directLoginGrid table.rows thead img { + padding-left: 10px; + vertical-align: middle; +} + +div.directLoginGrid table.rows thead tr th.unsorted span.sortable a { + background: url(../images/old/main/grid/directLogins/unsorted.png) no-repeat; +} + +div.directLoginGrid table.rows thead tr th.descending span.sortable a { + background: url(../images/old/main/grid/directLogins/descending.png) no-repeat; +} + +div.directLoginGrid table.rows thead tr th.ascending span.sortable a { + background: url(../images/old/main/grid/directLogins/ascending.png) no-repeat; +} + +/* @end */ + + + +/* @end */ + + + +/* @end */ + + +/* @end */ + +/* @group other Panels */ + +/* @group common styles */ +div.subPanelTabs { +} + +div.subPanelTabs ul { + margin: 0px; + margin-right: 7px; + padding: 0px; +} + +div.subPanelTabs ul li.first { +} + +div.subPanelTabs ul li { + display: inline-block; + vertical-align: middle; +/* width: 130px; */ + height: 50px; +/* border-right: 1px solid #a5a79c; + border-bottom: 1px solid #a5a79c;*/ + border-right: 1px solid #eef0e3; + border-bottom: 1px solid #d5d5bc; +} + +div.subPanelTabs ul li.first:hover { +/* background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -9px -5px; */ +} + +div.subPanelTabs ul li:hover { +/* background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -45px -5px; */ + border-right: 1px solid #d5d5bc; + background-color: #eef0e3; +} + +div.subPanelTabs ul li a { + color: #787872; + text-decoration: none; + display: block; + text-align: center; + padding-top: 15px; + padding-left: 20px; + padding-right: 20px; + font-size: 13pt; +} + +div.subPanelTabs ul li.first { +/* background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -9px -5px; */ + -webkit-border-top-left-radius: 20px; + -moz-border-radius-topleft: 20px; + border-top-left-radius: 20px; +} + +div.subPanelTabs ul li.selected { +/* background: url(../images/old/main/blocks/otherPanelBackground_selected.png) no-repeat -45px -5px; */ + background-color: #eef0e3; + border-bottom: 1px solid #eef0e3; + border-right: 1px solid #d5d5bc; +} + +div.subPanelTabs ul li.selected:hover { + border-right: 1px solid #d5d5bc; +} + + +div.subPanelTabs ul li.selected a { + color: #444440; +} + + + + + + +div.subPanelContent { + padding-top: 20px; + padding-left: 30px; + padding-right: 30px; + min-height: 280px; + color: #787872; + margin: 0px 6px 0 9px; +} + +div.subPanelContent ul { + margin: 0px; + padding: 0px; + list-style-type: none; +} + +div.subPanelContent ul li.selected { + display: block; +} + +div.subPanelContent ul li { + display: none; +} + +div.subPanelContent h3 { + margin: 0px; + border: 0px; + padding: 0px; +} + +/* @end */ + +/* @group mainPanels otherPanel */ +div.mainPanels div.otherPanel { + margin: 5px 10px; + background-color: #eef0e3; + + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; + + -webkit-box-shadow: 2px 2px 9px rgba(0,0,0,0.6); + -moz-box-shadow: 2px 2px 9px rgba(0,0,0,0.6); + box-shadow: 2px 2px 9px rgba(0,0,0,0.6); +} +div.mainPanels div.otherPanel div.header { +/* background: url(../images/old/main/blocks/otherPanelBackground.png) no-repeat; */ +/* + height: 90px; +*/ + background-color: #d5d5bc; + +/* padding-left: 9px; + padding-top: 5px; */ + margin: 0px; + margin-bottom: 0px; + + -webkit-border-top-left-radius: 20px; + -webkit-border-top-right-radius: 20px; + -moz-border-radius-topleft: 20px; + -moz-border-radius-topright: 20px; + border-top-left-radius: 20px; + border-top-right-radius: 20px; +} + +div.mainPanels div.otherPanel div.body { +/* background: url(../images/old/main/blocks/otherPanelBackground.png) repeat-y -836px; */ + margin: 0px; + border: 0px; + padding: 0px; +} + +div.mainPanels div.otherPanel div.footer { +/* background: url(../images/old/main/blocks/otherPanelBackground.png) 834px -18px; */ + height: 45px; +} + +div.mainPanels div.otherPanel div.body h1 { + margin: 0px; +} + +/* @end */ + +/* @group Account */ + +form.changePassphrase { +} + +form.changePassphrase div.currentCredentials, +form.changePassphrase div.newPassphrase { + float: left; + padding: 10px 20px; +} + +form.changePassphrase label { + display: inline-block; + width: 150px; +} + +form.changePassphrase div.confirm { + clear: both; + padding: 10px 20px; +} + +form.changePassphrase div.confirm label { + width: 500px; +} + +div.currentCredentials { +} + +div.accountPanel h3.manageOTP { + margin-top: 20px; + margin-left: -20px; + padding-top: 10px; + padding-left: 20px; + border-top: 1px solid #aaaaaa; +} + +/* @end */ + + + +/* @end */ + +/* @group Message Panel (?) */ +/* +div.messagePanelWrapper div.mask { + position: fixed; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + + background-color: black; + z-index:50001; + + -moz-opacity: 0.0; + opacity:.0; + filter: alpha(opacity=0); +/ * + -moz-opacity: 0.7; + opacity:.70; + filter: alpha(opacity=70); +* / +} + +div.messagePanelFrame { + border: 1px solid white; + z-index:50002; +/ * + width: 443px; + height: 155px; + position: fixed; + top: 205px; + left: 260px; + margin-left: auto; + margin-right: auto; + max-width: 468px; +* / +} + + +div.messagePanel { + position: fixed; + z-index:50003; + top: 0px; + left: 0px; +/ * + margin-left: auto; + margin-right: auto; + max-width: 468px; + top: 200px; + left: 250px; + left: 100px; + right: 100px; +* / +} + +div.messagePanel div.header { + height: 34px; + width: 468; + background-image: url(../images/old/alert/header.png); +} + +div.messagePanel div.body { + background-image: url(../images/old/alert/body.png); + padding: 0px 20px 10px 20px; + min-height: 100px; +} +/ * +div#javaScriptAlert div.body div.alert { + padding-left: 100px; + background: url(../images/old/alert/alert.png) no-repeat; +} +* / + +div.messagePanel div.body img.alert { + float: left; +} + +div.messagePanel div.body div.alert { + padding-left: 100px; +} + +div.messagePanel div.footer { + height: 34px; + width: 468; + background-image: url(../images/old/alert/footer.png); +} + +div.messagePanel div.message h1 { + font-size: 16pt; + margin: 0px; + color: #ff5930; +} + +div.messagePanel div.message p { + margin-top: 0px; + color: #999999; +} + +div.messagePanel div.message h3 { + font-size: 12pt; + margin-bottom: 0px; + color: #ff5930; +} + +div.messagePanel div.message h5 { + margin: 0px; + color: #999999; +} + + +*/ +/* @end */ + +/* @group LoginProgress (?) */ +/* +div#loginProgress { + position: relative; + left: -198px; + top: -118px; + width: 397px; + height: 236px; + background: url(../images/old/loginProgress/background.png); +} + +div#loginProgress div.header { + height: 52px; +} + +div#loginProgress div.header h3 { + font-size: 12pt; + font-weight: normal; + margin: 0px; + color: #787872; + padding-top: 25px; + padding-left: 35px; +} + +div#loginProgress div.body { + height: 120px; + overflow: auto; + margin-left: 19px; + margin-right: 18px; +} + +div#loginProgress div.footer { + margin-left: 19px; + margin-right: 18px; +} + +div#loginProgress div.footer a { + font-weight: bold; + text-decoration: none; + text-align: center; + color: #787872; + display: block; + font-size: 11pt; + width: 100px; + margin-top: 13px; + margin-left: auto; + margin-right: auto; +} + +div#loginProgress div.footer a:hover { + color: #515247; +} + +*/ + +/* @end */ + + + +div#modalDialogMask, +div.modalDialogMask { + z-index: 20000; +/* position: absolute; */ + position: fixed; + top:0; + left:0; + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity=50); +/* background-color: #cccccc; */ + background-color: #000000; + width: 100%; + height: 100%; + zoom: 1; +} + +div#modalDialogFrame, +div.modalDialogFrame { + position: absolute; +/* border: 1px solid white; */ + -moz-opacity: 0.5; + opacity: .50; + filter: alpha(opacity=50); + background-color: #333333; + z-index: 20001; + + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; +} + +div#modalDialog, +div.modalDialog { + z-index: 20001; +} + +/*div#modalDialog.scrollable,*/ +div.modalDialog.scrollable { + position: absolute; + top: 0; + left: 50%; +} + +/*div#modalDialog.fixed,*/ +div.modalDialog.fixed { + position: fixed; + top: 40%; + left: 50%; +} + +div#modalDialog div, +div.modalDialog div { + z-index: 20002; + list-style-type: circle; +} + + + +div.modalDialogMask.simpleMessagePanelMask { + z-index: 20010; +} + +div.modalDialogFrame.simpleMessagePanelMask { + z-index: 20011; +} + +div.modalDialog.simpleMessagePanelMask { + z-index: 20011; +} + +div.modalDialog.simpleMessagePanelMask div { + z-index: 20012; +} + + +/* @group Bookmarklet */ + +div.bookmarklet { +} + +div.bookmarklet div.bookmarklet_link { +/* + padding-top: 5px; + padding-left: 4px; + padding-right: 3px; + + float: right; + margin-top: 12px; + margin-right: 13px; +*/ + height: 34px; +} + +div.bookmarklet div.bookmarklet_link a { + color: #838975; + text-decoration: none; + font-weight: bold; + font-size: 10pt; +/* + display: block; + text-align: right; + padding-top: 7px; + padding-right: 11px; + padding-bottom: 6px; +*/ +} + +div.bookmarklet div.bookmarklet_link a div.icon { + background: url(../images/old/bookmarklet/placeholder_icon.png) no-repeat 0 0; + float: left; + width: 34px; + height: 34px; +} + +div.bookmarklet div.bookmarklet_link a:hover div.icon { + background: url(../images/old/bookmarklet/placeholder_selected_icon.png) no-repeat 0 0; +} + +div.bookmarklet div.bookmarklet_link a div.text { + display: block; + float: right; + background: url(../images/old/bookmarklet/placeholder.png) no-repeat right 0; + white-space: nowrap; + height: 34px; +} + +div.bookmarklet div.bookmarklet_link a:hover div.text { + background: url(../images/old/bookmarklet/placeholder_selected.png) no-repeat right 0; +} +div.bookmarklet div.bookmarklet_link a div.text span { + display: block; + padding-top: 10px; + padding-right: 10px; + padding-left: 6px; + + clear: both; +} + +/* @end */ + +/* @group Tooltip */ + +/* +div#Clipperz_PM_UI_Common_Components_Tooltip_wrapperNode { + position: absolute; + top: 0px; + left: 0px; +} +*/ + +div.tooltip { + position: absolute; + z-index: 30001; +} + + +div.tooltip div.tooltip_body { + position: absolute; +} + +div.tooltip div.tooltip_arrow { + position: absolute; +} + +div.tooltip.BELOW div.tooltip_arrow { + background: url(../images/old/tooltips/top_arrow.png) no-repeat; +} + +div.tooltip.ABOVE div.tooltip_arrow { + background: url(../images/old/tooltips/bottom_arrow.png) no-repeat; +} + +div.tooltip.LEFT div.tooltip_arrow { + background: url(../images/old/tooltips/right_arrow.png) no-repeat; +} + +div.tooltip.RIGHT div.tooltip_arrow { +/* margin-top: 7px; */ + background: url(../images/old/tooltips/left_arrow.png) no-repeat; +} +div.tooltip.RIGHT div.tooltip_body { +/* padding-left: 13px; */ +} + + +div.tooltip div.tooltip_body div.tooltip_text { + width: 171px; + background: url(../images/old/tooltips/body.png) no-repeat center top; +} + +div.tooltip.LEFT div.tooltip_body div.tooltip_text, +div.tooltip.RIGHT div.tooltip_body div.tooltip_text { + min-height: 45px; +} + +div.tooltip div.tooltip_body span { + display: block; + padding: 10px; + padding-bottom: 4px; + font-size: 10pt; + color: white; +} + +div.tooltip div.tooltip_footer { + height: 7px; + background: url(../images/old/tooltips/body_bottom.png) no-repeat; +} + +/* @end */ + +/* @group News */ +/* +div#news { + top: 11px; + left: 240px; + width: 353px; + height: 85px; + padding-top: 4px; + position: absolute; + overflow: hidden; + background: url(../images/old/note.png) 1px 3px; +} + +div#news.hidden { + display: none; +} + +div#news div.close { + display: inline; + margin-top: 6px; + margin-left: 17px; + float: left; + width: 15px; +} + +div#news div.close a { + text-decoration: none; + color: #929c1b; +} + +div#news div.close a:hover { + text-decoration: none; + color: #3d420b; +} + +div#news div#newsframe { + display: block; + overflow: hidden; + width: 305px; + height: 70px; +} + +div#news div#newsframe iframe { + border: 0px; +} +*/ +/* --------------------------------------- */ + +div#news { + top: -82px; + left: 240px; + width: 310px; + height: 90px; + position: absolute; +/* background: url(../images/old/tips/Tips_background.png) 0 -5px; */ + + background-color: #616474; + + -webkit-border-bottom-right-radius: 8px; + -webkit-border-bottom-left-radius: 8px; + -moz-border-radius-bottomright: 8px; + -moz-border-radius-bottomleft: 8px; + border-bottom-right-radius: 8px; + border-bottom-left-radius: 8px; + + -webkit-box-shadow: 2px 2px 9px rgba(0,0,0,0.6); + -moz-box-shadow: 2px 2px 9px rgba(0,0,0,0.6); + box-shadow: 2px 2px 9px rgba(0,0,0,0.6); +} +/* +div#news.open { + background: url(../images/old/tips/Tips_open.png) 0 -5px; +} + +div#news.hidden { + background: url(../images/old/tips/Tips_close.png) 0 -5px; +} +*/ +div#news div#newsframe { + margin-left: 10px; + margin-right: 10px; + height: 75px; + overflow: hidden; +} + +div#news div#newsframe.loading { + background: url(../images/old/loading/news.gif) no-repeat center center; +} + +div#news div#newsframe iframe { + width: 290px; + border: 0px; + color: #616474; + background-color: #616474; +} + +div#news div.grip { + width: 310px; + height: 12px; + margin-top: 2px; + cursor: pointer; +} + +div#news.open div.grip { + background: url(../images/old/tips/close.png) no-repeat center 6px; +} + +div#news.hidden div.grip { + background: url(../images/old/tips/open.png) no-repeat center 6px; +} + +/* @end */ + +/* @group mainDialog */ +div.mainDialog { + position: relative; + left: -263px; + width: 525px; + height: 325px; +} + +div.scrollable div.mainDialog { + top: 0px; +} + +div.fixed div.mainDialog { + top: -118px; +} + +div.mainDialog div.header { + height: 55px; + background: url(../images/old/cardDialog/background_header.png) no-repeat; +} + +div.mainDialog div.header div.title { + padding-top: 16px; + padding-left: 20px; + padding-right: 20px; +} + +div.mainDialog div.header div.title input { + width: 100%; + display: block; + font-size: 16pt; + margin: 0px; + border: 0px; + padding: 3px 10px; + color: #787872; + border: 1px solid #cccec0; + background-color: #cccec0; +} + +div.mainDialog div.header div.title h3 { + display: block; + font-size: 16pt; + color: #787872; + margin: 0px; + border: 0px; + padding: 3px 10px; +} + +div.mainDialog div.header div.title.selectedField input, +div.mainDialog div.header div.title:hover input { + border: 1px solid #515247; + background-color: #b5b7ab; +} + +div.mainDialog div.header div.title.disabled:hover input { + border: 1px solid #cccec0; + background-color: #cccec0; +} + +div.mainDialog div.body { + padding-top: 0px; + padding-left: 10px; + padding-right: 9px; + min-height: 200px; + background: url(../images/old/cardDialog/background_body.png) repeat-y; +} + +div.mainDialog div.body div.mask { + display: none; +} + +div.mainDialog.loading div.body div.mask { + display: block; + position: absolute; + top: 55px; + left: 10px; + right: 9px; + bottom: 70px; + z-index:1001; + background-color: white; + padding-left: 146px; + padding-right: 146px; + padding-top: 70px; +} + +div.mainDialog.loading div.body .tabPanels { + display: none; +} + +div.mainDialog.loading div.body div.mask h3.progressDescription { + margin: 0px; + text-align: center; + padding-bottom: 10px; + color: #cccec0; + font-size: 14pt; + font-weight: normal; +} + +div.loadingBar { + height: 22px; + width: 214px; + background: url(../images/old/loading/loadingBar.gif) no-repeat center top; +} + +div.loadingBar div.loadingBarProgressBox { + padding: 2px; +} + +div.loadingBar div.loadingBarProgress { + height:18px; + width: 0%; +/* background-repeat: no-repeat; */ + background-color: rgba(248,79,0,0.6); + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +/* +div.loadingBar div.loadingBarProgress div.loadingBarProgress_left { + height: 100%; + max-width: 8px; + background: url(../images/old/loading/loadingBarProgress.png) no-repeat 0; +} + +div.loadingBar div.loadingBarProgress div.loadingBarProgress_right { + position: relative; + height: 100%; + margin-left: 8px; + background: url(../images/old/loading/loadingBarProgress.png) no-repeat right; + top: -22px; +} +*/ + +div.mainDialog div.body div ul { + padding: 0px; + clear: both; + margin: 0px; + list-style-type: none; +} + +div.mainDialog div.body div.tabs { + height: 20px; +} + +div.mainDialog div.body div.tabs ul.tabs { + height: 33px; +/* border-bottom: 1px solid #515247;*/ +/* background: #cccec0 url(../images/old/cardDialog/tabs_shadow.png) repeat-x 0 -5px;*/ + background: url(../images/old/cardDialog/tabs_background.png) repeat-x; +} + +div.mainDialog div.body div.tabs ul.tabs li { +/* width: 150px; */ + height: 32px; + font-size: 11pt; + text-align: center; + border-right: 1px solid #515247; + float: left; + color: #787872; + border-bottom: 1px solid #515247; + + background: #cccec0 url(../images/old/cardDialog/tabs_shadow.png) repeat-x 0 -5px; + cursor: pointer; +} + +div.mainDialog div.body div.tabs ul.tabs li div { + display: none; +} + +div.mainDialog div.body div.tabs ul.tabs li span { + display: block; + padding-top: 9px; + padding-bottom: 6px; + padding-left: 40px; + padding-right: 40px; +} + +div.mainDialog div.body div.tabs ul.tabs li:hover { + color: #515247; +} + +div.mainDialog div.body div.tabs ul.tabs li.disabled:hover { + color: #787872; + cursor: default; +} + +div.mainDialog div.body div.tabs ul.tabs li.selected { + color: #515247; + background-color: #f1f2e9; + border-bottom: 1px solid #f1f2e9; + cursor: default; +} + +div.mainDialog div.body div.tabs ul.tabs li.selected.disabled:hover { + color: #515247; +} + +div.mainDialog div.body div.tabs ul.tabs li.selected div.backToDirectLoginList { + position: absolute; + display: block; + top: 63px; + left: 140; + width: 20px; +} + +div.mainDialog div.body div.tabs ul.tabs li.selected div.addDirectLoginButton { + position: absolute; + display: block; + top: 63px; + left: 265px; + + width: 20px; +} + +div.mainDialog div.body div.tabs ul.tabs li.selected div span { + padding: 0px; + margin: 0px; +} + +div.mainDialog div.body div.tabs ul.tabs li.selected div:hover { + cursor: pointer; +} + +div.mainDialog div.body .tabPanels { + clear: both; +} + +div.mainDialog div.body ul.tabPanels li.tabPanel { + display: none; +} + +div.mainDialog div.body ul.tabPanels li.tabPanel.selected { + display: block; +} + +div.mainDialog div.body ul.tabPanels li.tabPanel.selected h2 { + margin: 0px; + text-align: center; + padding-top: 50px; + color: #787872; +} + +div.mainDialog div.body ul.tabPanels li.tabPanel.selected div.wizardStepDescription { + margin: 0px 20px 10px; + font-size: 10pt; + color: b0b0b0; + font-style: italic; + text-align: center; +} + +div.mainDialog div.footer { + height: 70px; + background: url(../images/old/cardDialog/background_footer.png) no-repeat 0 -14px; +} + +div.mainDialog div.footer div.buttonArea { + padding-left: 40px; + padding-right: 40px; + padding-top: 15px; +} + +div.mainDialog div.footer div.buttonArea div { + padding-left: 20px; + padding-right: 20px; + float: left; + + font-weight: bold; + color: #787872; +} + +div.mainDialog div.footer div.buttonArea div.disabled { + color: #b1b1a8; +} + +div.mainDialog div.footer div.buttonArea div.disabled:hover { + color: #b1b1a8; + cursor: default; +} + +div.mainDialog div.footer div.buttonArea div:hover { + color: #515247; + cursor: pointer; +} + +div.mainDialog div.footer div.buttonArea div.save { + float: right; +} + + +/* @end */ + +/* @group Card Dialog */ + +div.addDirectLoginButton { + height: 20px; + width: 20px ; + background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat -9px -9px; + color: white; + font-weight: bold; +} + +div.addDirectLoginButton span { + display: block; + height: 20px; + width: 20px ; +} + +div.addDirectLoginButton:hover { + background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat -9px -9px; +} + +/* @group Card Dialog - Direct Login */ + +div.directLoginsComponentContainer { + overflow: hidden; +/* background-color: green; */ +} + +div.CardDialog div.directLogins { +/* background-color: yellow; */ + padding-top: 2px; +} + +div.CardDialog div.addNewDirectLoginSplash { + margin: 0px 80px; +} + +div.CardDialog div.addNewDirectLoginSplash h3 { + color: #aaaaaa; + text-align: center; + font-weight: normal; + font-size: 11pt; +} + +div.CardDialog div.addNewDirectLoginSplash a { + display: block; + text-decoration: none; + margin-left: auto; + margin-right: auto; + width: 190px; +/* color: #787878; */ + color: rgba(255,98,6,0.75); + text-transform: uppercase; + background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat right; +} + +div.CardDialog div.addNewDirectLoginSplash a span { + text-align: center; +} + +div.CardDialog div.addNewDirectLoginSplash a:hover { + color: #ff6206; + background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat right; +} + +div.CardDialog div.directLoginItem { + clear: both; + min-height: 32px; + padding-left: 10px; + padding-top: 4px; + padding-bottom: 2px; + +/* width: 100px; */ + max-height: 32px; + overflow: hidden; +} + +div.CardDialog div.directLoginItem:hover { + background-color: #cccec0; +} + +div.CardDialog div.addDirectLoginListItem { + min-height: 32px; + padding-left: 10px; + padding-top: 4px; + padding-bottom: 2px; + + max-height: 32px; + overflow: hidden; + + background: url(../images/old/cardDialog/addDirectLogin_disabled_background.png) no-repeat 22px 0; +} + +div.CardDialog div.addDirectLoginListItem a { + display: block; + font-size: 11pt; + padding-top: 6px; + padding-left: 50px; + color: rgba(255,98,6,0.75); + text-decoration: none; + text-transform: uppercase; +} + +div.CardDialog div.addDirectLoginListItem:hover { + background: url(../images/old/cardDialog/addDirectLogin_background.png) no-repeat 22px 0; + color: #ff6206; + background-color: #cccec0; +} + +div.CardDialog div.addDirectLoginListItem:hover { +} + + +div.CardDialog div.directLoginItem div.cardDialogRecordDirectLoginComponent_favicon img.favicon { + width: 32px; + height: 32px; + float: left; +} +div.CardDialog div.directLoginItem div.cardDialogRecordDirectLoginComponent_label input { + float: left; + font-size: 11pt; + border: 0px; + padding: 5px; + color: #787872; + border: 1px solid #ededeb; + background-color: #ededeb; + height: 30px; + margin-left: 10px; + width: 68%; + margin-right: 5px; +} + +div.CardDialog div.directLoginItem:hover div.cardDialogRecordDirectLoginComponent_label input { + border: 1px solid #515247; + background-color: #b5b7ab; +} + +div.CardDialog div.directLoginItem > div.open { + float: left; + margin-top: 5px; + margin-right: 2px; + padding-left: 5px; + visibility: hidden; +} + +div.CardDialog div.directLoginItem > div.edit, +div.CardDialog div.directLoginItem > div.delete { + float: left; + margin-top: 5px; + margin-left: 3px; + padding-left: 5px; + visibility: hidden; +} + +div.CardDialog div.directLoginItem > div.open a { + display: block; + width: 22px; + height: 22px; + background: url(../images/old/cardDialog/openDirectLogin.png) no-repeat 0 -2px; +} + +div.CardDialog div.directLoginItem > div.open a:hover { + background: url(../images/old/cardDialog/openDirectLogin_selected.png) no-repeat 0 -2px; +} + +div.CardDialog div.directLoginItem:hover > div.open, +div.CardDialog div.directLoginItem:hover > div.edit, +div.CardDialog div.directLoginItem:hover > div.delete { + visibility: visible; +} + +div.CardDialog div.directLoginItem div.edit span { + padding-right: 6px; + display: block; +} + +div.CardDialog div.directLoginItem div.open span a, +div.CardDialog div.directLoginItem div.edit span a, +div.CardDialog div.directLoginItem div.delete span a { + font-size: 8pt; + color: #666666; + text-decoration: none; + line-height: 19px; +} + +div.CardDialog div.directLoginItem div.edit:hover { + background: url(../images/old/new_background_left.png) no-repeat; +} + +div.CardDialog div.directLoginItem div:hover span a { + color: white; +} + +div.CardDialog div.directLoginItem div.edit:hover span { + background: url(../images/old/new_background.png) no-repeat right center; +} + +div.CardDialog div.directLoginItem div.delete:hover { + background: url(../images/old/delete_background_left.png) no-repeat; +} + +div.CardDialog div.directLoginItem div.delete:hover span { + background: url(../images/old/delete_background.png) right; +} + +/* @group Direct Login Editing */ + +div.CardDialog div.directLoginEditDetail { + position: relative; +/* background-color: red; */ +} + +/* +div.CardDialog div.directLoginEditDetail div.back { + float: left; + width: 30px; +} + +div.CardDialog div.directLoginEditDetail div.back a { + display: block; + padding: 5px; + text-decoration: none; + font-weight: bold; + font-size: 14pt; + color: #cccec0; + + background: url(../images/old/cardDialog/back.png) no-repeat 5px 14px; + width: 20px; + height: 200px; +} + +div.CardDialog div.directLoginEditDetail div.back a:hover { + color: #7f7872; + background: url(../images/old/cardDialog/back_selected.png) no-repeat 5px 14px; +} +*/ + + +form.directLoginEditingForm div.title, +form.directLoginEditingForm div.favicon { + padding: 5px 10px; +} + +form.directLoginEditingForm div.title.disabled:hover { + background-color: #f1f2e9; +} + +form.directLoginEditingForm div.title:hover, +form.directLoginEditingForm div.favicon:hover { + background-color: #cccec0; +} + +form.directLoginEditingForm div.title input { +/* width: 100%; */ + margin: 0px; + margin-left: 10px; + width: 440px; +} + +form.directLoginEditingForm div.favicon { + padding-left: 10px; +} + +/*form.directLoginEditingForm div.favicon img.favicon {*/ +form.directLoginEditingForm img.favicon { + float: left; + width: 32px; + height: 32px; +} + +form.directLoginEditingForm div.favicon input { + margin-top: 1px; + width: 465px; +} + +form.directLoginEditingForm div.disabled:hover input, +form.directLoginEditingForm div input { + font-size: 11pt; + border: 0px; + padding: 5px; + color: #787872; + border: 1px solid #ededeb; + background-color: #ededeb; + height: 30px; +} + +form.directLoginEditingForm div:hover input { + border: 1px solid #515247; + background-color: #b5b7ab; +} + +/* @group Bindings */ + +div.bindings div.binding > span.formFieldName { + display: inline-block; + width: 140px; + overflow: hidden; + margin-right: 10px; + color: #6b5147; + text-overflow:ellipsis; +} + +div.bindings div.binding { + padding-bottom: 3px; +} + +div.bindings div.binding > input { + margin-right: 10px; + background: #cccec0; + width: 150px; + border: 1px solid #cccec0; +} + +div.bindings div.binding:hover > input { + border: 1px solid #cccec0; +} + +div.bindings div.binding > select { + font-size: 13pt; +} + +div.bindings div.binding span.fieldLock { + display: inline-block; + width: 20px; + height: 20px; + margin-right: 3px; +} + +div.bindings div.binding.showLocked input { + background: url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px; +/* color: black; */ + overflow: hidden; + + background: #cccec0 url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px; + color: rgba(237,237,235,0.1); +} + +div.bindings div.binding span.fieldLock a { + display: none; +} + +div.bindings div.binding.locked span.fieldLock { +} + +div.bindings div.binding.locked span.fieldLock a { + display: block; + width: 20px; + height: 20px; + text-decoration: none; + + background-image: url(../images/old/cardDialog/lock_open.png); +} + +div.bindings div.binding.locked.showLocked span.fieldLock a { + background-image: url(../images/old/cardDialog/lock_closed.png); + text-decoration: none; +} + +/* @end */ + +/* @group FormValues */ + +div.formValues { + padding-top: 15px; +} + +div.formValues div.formValue div { + margin: 0px; + display: inline-block; +} + +div.formValues div.formValue > span.formFieldName { + display: inline-table; + width: 160px; + overflow: hidden; + margin-right: 10px; + color: #6b5147; +} + +/* @end */ + + +/* @group FormValues */ +/* +div.formValues { + padding-top: 15px; +} + +div.formValues div.formValue > span.formFieldName { + display: inline-table; + width: 150px; + overflow: hidden; + margin-right: 35px; + color: #6b5147; +} + +div.formValues div.formValue > select { + padding-left: 20px; +} +*/ +/* @end */ + +/* @group Panels */ + +div.directLoginEditing { + padding-top: 2px; +} + +div.directLoginEditing div.tabContainer { + min-height: 150px; + height: 200px; +} + +div.directLoginEditing div.tabContainer > ul.tabs { + display: none; +} + +/* +div.directLoginEditing li.configuration, +div.directLoginEditing li.bindings, +div.directLoginEditing li.favicon { + padding: 10px; +} +*/ +div.directLoginEditing li { + padding: 10px; +} + +div.directLoginEditing li.configuration > .bookmarkletConfigurationWrapper > textarea { + float: left; + width: 320px; + height: 125px; + font-family: monospace; + font-weight: normal; + font-size: 8pt; + border: 1px solid #ccc; +} + +div.directLoginEditing li.configuration > .bookmarkletConfigurationWrapper .bookmarkletComponent { + float: right; +} + +div.directLoginEditing li.configuration > textarea.error { + border: 1px solid red; + background-color: rgba(255,0,0,0.1); +} + +/* +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer { + padding-top: 10px; +} + +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li { + float: left; + padding-left: 10px; + padding-right: 10px; + display: block; + font-size: 10pt; + color: #787872; + cursor: pointer; + + height: 22px; + text-align: center; + border-right: 1px solid #aaa; + border-bottom: 1px solid #aaa; + border-top: 1px solid #aaa; + + background-color: #cccec0; +} + +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li:first-child { + border-left: 1px solid #aaa; +} + +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs { + height: 23px; + padding-left: 10px; + border-bottom: 1px solid #aaa; + margin-left: 10px; + margin-right: 10px; +} + +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li > span { + line-height: 23px; +} + +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li.selected { + color: #6a5147; + cursor: default; + border-bottom: 1px solid #f1f2e9; + background-color: #f1f2e9; +} + +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabs > li:hover { + color: #6a5147; +} + +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabPanels { + padding-bottom: 5px; + margin-left: 10px; + margin-right: 10px; +} + +div.directLoginEditing > form.directLoginEditingForm > div.tabContainer > ul.tabPanels > li.selected { + border-bottom: 1px solid #aaa; + border-left: 1px solid #aaa; + border-right: 1px solid #aaa; +} + +div.directLoginEditing li.configuration { + padding: 5px; +} + +div.directLoginEditing li.configuration > textarea { + width: 100%; + height: 100px; + font-family: monospace; + font-weight: normal; + font-size: 8pt; +} +*/ +/* @end */ + +/* @end */ + +/* @end */ + +/* @group Card Dialog FIELDS */ + +div.CardDialog div.body { + padding-bottom: 1px; +} + +div.CardDialog div.body table.fields { + width: 100%; + padding-top: 8px; + padding-bottom: 1px; +} + +div.CardDialog div.body table.fields thead { + background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 15px; +} + +div.CardDialog div.body table.fields tfoot { + background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 bottom; +} + +div.CardDialog div.body table.fields thead th { + text-align: left; + font-weight: normal; + font-size: 9pt; + color: #787872; + padding-left: 10px; + padding-bottom: 3px; + +/* + border-bottom: 1px dotted; +*/ +} + + +div.CardDialog div.body table.fields thead th.fieldStateTH { + width: 10px; +} + +div.CardDialog div.body table.fields thead th.fieldLabelTH { +} + +div.CardDialog div.body table.fields tbody td.fieldLabel input { + width: 130px; +} + +div.CardDialog div.body table.fields thead th.fieldLockTH { + width: 10px; +} + + +div.CardDialog div.body table.fields thead th.fieldValueTH { +} + +div.CardDialog div.body table.fields tbody td.fieldValue input { + width: 280px; +} + +div.CardDialog div.body table.fields thead th.fieldActionTH { + width: 30px; +} + +div.CardDialog div.body table.fields tbody td.fieldAction div { +} + +div.CardDialog div.body table.fields thead th.fieldDeleteTH { + width: 40px; +} + +div.CardDialog div.body table.fields tbody tr:hover, +div.CardDialog div.body table.fields tbody tr.selectedField { + background-color: #cccec0; +} + +div.CardDialog div.body table.fields tbody tr td { + font-size: 11pt; + color: #787872; + height: 35px; +} + + +div.CardDialog div.body table.fields tbody tr td input { + font-size: 11pt; + border: 0px; + padding: 5px; + color: #787872; + border: 1px solid #ededeb; + background-color: #ededeb; + height: 30px; +} +/* +div.CardDialog div.body table.fields tbody tr td.fieldValue div { + margin-right: 10px; +} + +div.CardDialog div.body table.fields tbody tr td.fieldValue div input { + width: 100%; +} +*/ +div.CardDialog div.body table.fields tbody tr td.fieldValue div.locked input { + background: #ededeb url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px; + color: #ededeb; + color: rgba(237,237,235,0.1); +/* color: black; */ +/* line-height: 100px; */ + overflow: hidden; +} + +div.locked input.value::-moz-selection { + background: #ff0000; +} + +div.locked input.value::selection { + background: #ff0000; +} + + +div.CardDialog div.body table.fields tbody tr.new.selectedField td input, +div.CardDialog div.body table.fields tbody tr.new:hover td input, +div.CardDialog div.body table.fields tbody tr:hover td input, +div.CardDialog div.body table.fields tbody tr.selectedField td input { + border: 1px solid #515247; + background-color: #b5b7ab; +} + +div.CardDialog div.body table.fields tbody tr:hover td.fieldValue div.locked input, +div.CardDialog div.body table.fields tbody tr.selectedField td.fieldValue div.locked input { + background: #b5b7ab url(../images/old/cardDialog/password_background.png) no-repeat 2px 3px; + color: #b5b7ab; + color: rgba(237,237,235,0.1); +} + + + +div.CardDialog div.body table.fields tbody td.fieldLock div { + width: 20px; + height: 19px; + cursor: pointer; +} + +div.CardDialog div.body table.fields tbody tr:hover td.fieldLock div.locked { + background-image: url(../images/old/cardDialog/lock_closed.png); +} + +div.CardDialog div.body table.fields tbody tr:hover td.fieldLock div.unlocked { + background-image: url(../images/old/cardDialog/lock_open.png); +} + +div.CardDialog div.body table.fields tbody tr td.fieldAddDelete div span a { + text-decoration: none; + visibility: hidden; + font-size: 8pt; + vertical-align: -13px; + color: black; +} + +div.CardDialog div.body table.fields tbody tr.selectedField td.fieldAddDelete div span a { + visibility: visible; +} + +div.CardDialog div.body table.fields tbody tr:hover td.fieldAddDelete div span a { + visibility: visible; +} + +div.CardDialog div.body table.fields tbody tr:hover td.fieldAddDelete div:hover span a { + color: white; +} + + +div.CardDialog div.body div.notes { + background: url(../images/old/cardDialog/dottedLine_background.png) repeat-x 0 0; + padding-top: 2px; +} + +div.CardDialog div.body div.notes div { + padding-left: 20px; + padding-right: 20px; + padding-top: 4px; + padding-bottom: 4px; +} + +div.CardDialog div.body div.notes div:hover, +div.CardDialog div.body div.notes.selectedField div { + background-color: #cccec0; +} + +div.CardDialog.loading div.body div.notes div textarea { + display: none; +} + +div.CardDialog div.body div.notes div textarea { + border: 0; + width: 470px; +/* + width: 100%; + height: 100px; + min-height: 400px; + overflow: hidden; +*/ + color: #787872; + border: 1px solid #ededeb; + background-color: #ededeb; + display: block; + line-height: 12pt; + min-height: 50px; +} + +div.CardDialog div.body div.notes div:hover textarea, +div.CardDialog div.body div.notes.selectedField div textarea { + border: 1px solid #515247; + background-color: #b5b7ab; +} + + +div.CardDialog div.body table.fields tbody tr td.fieldAction { +/* background-color: red; */ + padding-left: 4px +} + +div.CardDialog div.body table.fields tbody tr td.fieldAction a { + display: inline-block; + text-decoration: none; + text-align: center; + width: 16px; + height: 16px; +} + +div.CardDialog div.body table.fields tbody tr td.fieldAction a.email { + background: url(../images/old/cardDialog/fieldTypes/email.png) no-repeat 0 0; +} + +div.CardDialog div.body table.fields tbody tr td.fieldAction a.email:hover { + background: url(../images/old/cardDialog/fieldTypes/email_selected.png) no-repeat 0 0; +} + +div.CardDialog div.body table.fields tbody tr td.fieldAction a.url { + background: url(../images/old/cardDialog/fieldTypes/url.png) no-repeat 0 0; +} + +div.CardDialog div.body table.fields tbody tr td.fieldAction a.url:hover { + background: url(../images/old/cardDialog/fieldTypes/url_selected.png) no-repeat 0 0; +} + +div.CardDialog div.body table.fields tbody tr td.fieldAction a.password { + background: url(../images/old/cardDialog/fieldTypes/password.png) no-repeat 0 0; +} + +div.CardDialog div.body table.fields tbody tr td.fieldAction a.password:hover { + background: url(../images/old/cardDialog/fieldTypes/password_selected.png) no-repeat 0 0; +} + +/* +/ *div.CardDialog div.body table.fields tbody* / tr.new { + background: yellow; +} + +div.CardDialog div.body table.fields tbody tr.new td input { + border: 1px solid red; + background-color: green; +} +*/ +/* @end */ + + + +/* @end */ + +div#disabledZone { + display: block; + visibility: visible; +} + +div#messageZone { + display: block; + visibility: visible; +} + + +div.CardDialog div.error div.img { + margin: 10px; + width: 50px; + height: 50px; + float: left; + + background-image: url(../images/old/simpleMessageBox/Alert.png); +} + +/* @group Ruler */ +/* +div.rulerExtraWrapper { + position: absolute; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + overflow: hidden; + background-color: rgba(255, 0, 0, 0.2); + z-index: 24999; +} +*/ + +div.rulerWrapper { + left: -1000px; + margin-top: -30px; + margin-left: 50%; + z-index: 25000; +} + +div.rulerWrapper.fixed { + position: fixed; +} + +div.rulerWrapper.scrollable { + position: absolute; +} + +div.ruler { +/* position: absolute; */ + width: 541px; + height: 96px; + margin-left: -270px; + + background: url(../images/old/ruler/ruler.png) no-repeat; +} + +div.ruler a { + position: absolute; + display: block; + + width: 15px; + height: 15px; + top: 3px; + text-decoration: none; +} + +div.ruler a.exit { + margin-left: 2px; + background: url(../images/old/ruler/exit.png) no-repeat; +} + +div.ruler a.exit:hover { + background: url(../images/old/ruler/exit_selected.png) no-repeat; +} + +div.ruler a.smallButton.previous { + right: 16px; + background: url(../images/old/ruler/small_previous.png) no-repeat; +} + +div.ruler a.smallButton.previous:hover { + cursor: pointer; + background: url(../images/old/ruler/small_previous_selected.png) no-repeat; +} + +div.ruler a.smallButton.previous.disabled, +div.ruler a.smallButton.previous.disabled:hover { + cursor: default; + background: url(../images/old/ruler/small_previous_disabled.png) no-repeat; +} + +div.ruler a.smallButton.next { + right: 3px; + background: url(../images/old/ruler/small_next.png) no-repeat; +} + +div.ruler a.smallButton.next:hover { + cursor: pointer; + background: url(../images/old/ruler/small_next_selected.png) no-repeat; +} + +div.ruler a.smallButton.next.disabled, +div.ruler a.smallButton.next.disabled:hover { + cursor: default; + background: url(../images/old/ruler/small_next_disabled.png) no-repeat; +} + +div.ruler div.steps, div.ruler div.dots { + position: absolute; + background-color: rgba(255,255,255,0); + + margin-left: 30px; + margin-right: 30px; +} + +div.ruler div.steps { + top: 25px; + height: 30px; +} + +div.ruler div.dots { + top: 58px; + height: 25px; +} + +div.ruler div ul { + list-style-type: none; + margin: 0px; + padding: 0px; +} + +div.ruler div ul li { + display: inline-block; + vertical-align: top; +} + +div.ruler > div.steps > ul > li:first-child, +div.ruler > div.dots > ul > li:first-child { + margin-left: 0px; +} + +div.ruler div.steps_3 ul li { + margin-left: 135px; +} + +div.ruler div.steps_4 ul li { + margin-left: 67px; +} + +div.ruler div.steps_5 ul li { + margin-left: 32px; +} + +div.ruler div.steps_6 ul li { + margin-left: 12px; +} + +div.ruler div ul li span { + font-weight: bold; + text-align: center; + width: 70px; + display: block; + font-size: 8pt; + overflow: hidden; + color: rgba(0, 0, 0, 0.3); +} + +div.ruler div ul li.selected span { + color: black; +} + +div.ruler div.steps ul li span { +} + +div.ruler div.dots ul li span { +/* + text-align: center; + width: 26px; + margin-left: 22px; + margin-right: 22px; + height: 25px; + background-color: #e57218; +*/ + font-size: 40pt; + line-height: 47px; +} + +div.ruler div.marker { + position: absolute; + top: -3px; +/* left: -246px; */ +} +div.ruler div.marker div.markerBody { + width: 77px; + height: 97px; + background: url(../images/old/ruler/marker.png) no-repeat; +} + +div.ruler div.marker div.next { + position: absolute; + top: 25px; + left: 76px; + width: 27px; + height: 65px; + background: url(../images/old/ruler/next.png) no-repeat -13px; + + z-index: 26000; +} + +div.ruler div.marker div.next:hover { + cursor: pointer; + background: url(../images/old/ruler/next.png) no-repeat -2px; +} + +div.ruler div.marker div.disabled { + display: none; +} + +div.ruler div.marker div.previous { + position: absolute; + top: 25px; + left: -24px; + width: 27px; + height: 65px; +/* background: url(../images/old/ruler/previous.png) no-repeat 13px 1px; */ + background: url(../images/old/ruler/previous.png) no-repeat 18px 1px; + + z-index: 26000; +} + +div.ruler div.marker div.previous:hover { + cursor: pointer; +/* background: url(../images/old/ruler/previous.png) no-repeat 2px 1px; */ + background: url(../images/old/ruler/previous.png) no-repeat 7px 1px; +} + +/* @end */ + +div.createNewCardSplash { + margin-top: -450px; + margin-left: 250px; + width: 354px; + float: left; + height: 186px; + + text-align: center; + background: url(../images/old/main/grid/createNewCardSplash.png) no-repeat; +} + +div.createNewCardSplash:hover { + cursor: pointer; + background: url(../images/old/main/grid/createNewCardSplash_selected.png) no-repeat; +} + +div.createNewCardSplash span { + display: block; + padding-top: 130px; + font-size: 14pt; + color: #9a9586; +} + +div.createNewCardSplash:hover span { + color: #605c4e; +} + + + +/*=============================================*/ + +div.NewUserCreation div.tabContainer { + min-height: 150px; + height: 200px; +} + +div.NewUserCreation div.tabContainer > ul.tabs { + display: none; +} + +ul.createUserStates li.creating { + background: url(../images/old/creatingUser.gif) no-repeat center center; +} + +ul.createUserStates li { + height: 100px; +} + +ul.createUserStates li span { + display: block; + width: 100%; + text-align: center; + color: #999; + font-style: italic; +} + +div.NewUserCreation form.newUserCreationForm ul.tabPanels { + padding-top: 10px; +} + +div.NewUserCreation form.newUserCreationForm ul ul { + margin-left: auto; + margin-right: auto; + width: 400px; +} + +div.NewUserCreation form.newUserCreationForm ul.credentials li { + height: 45px; +} + +div.NewUserCreation form.newUserCreationForm ul.credentials span.label { + text-align: right; + display: inline-block; + font-size: 12pt; + color: #787872; + width: 110px; + vertical-align: baseline; +} + +div.NewUserCreation form.newUserCreationForm ul.credentials input { + font-size: 13pt; + color: #787872; + height: 35px; + margin-left: 15px; + padding-left: 5px; +} + +div.NewUserCreation form.newUserCreationForm ul.termsOfService li { + padding: 0 0 15 0; +} + +div.NewUserCreation form.newUserCreationForm ul.termsOfService input { + display: inline-block; +} + +div.NewUserCreation form.newUserCreationForm ul.termsOfService .label { + display: inline-block; + text-align: left; + font-size: 12pt; + color: #787872; + width: 350px; + vertical-align: top; + padding-left: 10px +} + +div.NewUserCreation form.newUserCreationForm ul.termsOfService a { + font-weight: bold; + color: #787872; + text-decoration: none; +} +div.NewUserCreation form.newUserCreationForm ul.termsOfService a:hover { + color: #444; +} + +div.NewUserCreation form.newUserCreationForm ul.createUserStates li.done span { + font-size: 16pt; + color: green; +} + +div.NewUserCreation form.newUserCreationForm ul.createUserStates li.fail span { + font-size: 16pt; + color: red; +} \ No newline at end of file diff --git a/frontend/gamma/css/clipperz/compact.css b/frontend/gamma/css/clipperz/compact.css new file mode 100644 index 0000000..7c9252a --- /dev/null +++ b/frontend/gamma/css/clipperz/compact.css @@ -0,0 +1,162 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* @override https://www.example.com/css/compact.css */ + +body.compact div#mainDiv { +/* + width: 250px; + height: 95%; + border: 1px solid #333366; +*/ + padding: 0px; +} + +body.compact div#compactHeader { + background-color: #333366; +} + +body.compact div#compactHeader img { + padding: 2px 20px 2px 4px; + width: 60; +} + +body.compact div#compactHeader a { + color: white; + text-decoration: none; + font-size: 10pt; +/* position: absolute; */ + right: 10px; + top: 6px; +} + +body.compact div#compactHeader a:hover { + color: #ff9400; +} + +body.compact h4 { + color: #999999; + text-align: center; + padding: 20px; + font-weight: normal; + font-size: 12pt; + font-style: italic; +} + +body.compact div.loginPanel form { + padding: 10px; +} + +body.compact div.loginPanel dt { + color: #aaaaaa; + font-size: 10pt; +} + +body.compact div.loginPanel input { + width: 180px; +} + +body.compact ul#directLogins { + background-image: none; + padding: 4px 0px; +} + +body.compact ul#directLogins li { + width:auto; +} + +body.compact ul#directLogins li.hover { + width:auto; + padding-right: 0px; +} + +body.compact div.lockPanel { + color: #999999; + font-size: 10pt; + padding: 10px; +} + +div#compactMiscLinks ul { +/* text-align: center; */ + display: block; + padding-left: 22px; + background-color: #ff9400; +} + +div#compactMiscLinks ul li { + display: inline; + padding: 2px 5px; +} + +div#compactHeader div#compactMiscLinks ul li a { + font-size: 9pt; +} + +div#compactHeader div#compactMiscLinks ul li a:hover { + color: #333366; +} + +div#lockBlock { + position: absolute; + right: 10px; + top: 6px; +} + +div#lockBlock input { + width: auto; + padding-bottom: 2px; +} + +div#lockBlock span { + font-size: 9pt; + padding: 0px 5px 0px 4px; + color: #aaaaaa; +} + +div#lockBlock a#lock { + font-size: 9pt; +} + +/* @group Donate */ + +a#donateHeaderLink { + font-weight: bold; +} + +div#compactMiscLinks a#donateHeaderIconLink img#donateHeaderLinkIcon { + display: inline; + position: absolute; + top: 22px; + left: 1px; + width: 12px; + height: 12px; +} + + + +/* @end */ \ No newline at end of file diff --git a/frontend/gamma/css/clipperz/iPhone.css b/frontend/gamma/css/clipperz/iPhone.css new file mode 100644 index 0000000..a15f22f --- /dev/null +++ b/frontend/gamma/css/clipperz/iPhone.css @@ -0,0 +1,464 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* @override + https://www.example.com/iPHONE/css/iPhone.css + https://www.example.com/DEVELOPMENT/css/iPhone.css + https://www.example.com/WIZARD/css/iPhone.css +*/ + +/* ---------------------------------------- */ + +body { + margin: 0; + font-family: Helvetica; + background: #FFFFFF; + color: #000000; + overflow-x: hidden; + -webkit-user-select: none; + -webkit-text-size-adjust: none; +} + + +div.toolbar { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + border-bottom: 1px solid #2d3642; + border-top: 1px solid #6d84a2; + padding: 10px; + height: 45px; +/* background: url(../images/old/iPhone/toolbar.png) #6d84a2 repeat-x; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x; +} + +div.toolbar h1#pageTitle { + overflow: hidden; + margin-top: 1px; + margin-bottom: 0px; + margin-left: auto; + margin-right: auto; + width: 150px; + height: 25px; /* 45px */ + font-size: 20px; + width: 150px; + font-weight: bold; + text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + color: #FFFFFF; +} + +div.toolbar a.button { + position: absolute; + overflow: hidden; + top: 8px; + right: 6px; + margin: 0; + border-width: 0 5px; + padding: 0 3px; + width: auto; + height: 30px; + line-height: 30px; + font-family: inherit; + font-size: 12px; + font-weight: bold; + color: #FFFFFF; + text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0; + text-overflow: ellipsis; + text-decoration: none; + white-space: nowrap; + background: none; +/* -webkit-border-image: url(../images/old/iPhone/toolButton.png) 0 5 0 5; */ +} + +div.toolbar a#backButton { +/* display: none; */ + left: 6px; + right: auto; + padding: 0px; + max-width: 55px; + border-width: 0 8px 0 14px; +/* -webkit-border-image: url(../images/old/iPhone/backButton.png) 0 8 0 14; */ + -webkit-border-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAeCAIAAAA6iHCJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAtJJREFUeNrEV21P01AYbbtubNExBnXDbYjjZYI4BMdgEANDQoTElw/+Rw0mBs0UiSGaoJFEQEPwjRhFCW/JxrZ2Xdu1fe71bpAhCHzqupPnS5ObPOeec+5zb+lHLxao05HPiwvzr3/++J7N7FFGgaaDLe034+O+wCXyxSKET1u5+Wc98XTK39zeOzjudLmNIoAR2tlaf/Zkqm9gKNI/RBigE9dtb23MJKZj8fvuC16b3WGxsJRxOFfHeQOtH+ZnOI+XRfgEBoLAzz6fjo7ebfD4GYYhMiEdDGRAW6xOt6d7YGzl4xIL/7mgyPL044edkVt19T4EFAJEVQYud+MvOCkHc7MJ3+VrXGOzXrHeZS1s9trjOVj7tiqpONTWBRgD6BVmQFls9iMaSHnx/bu3ffEHgC2gVVqAIojKR3Iw9zLRcjVmtTnA0NydxQDg0IWvq59kYIOeZtWs9gQkagcMcgK/vLjYNXQHcEkas0AcYPdNIPr7Q/0M69B089ofavB5ZVm3OJ2cTwegzAUgxGbSe8tLS52xewjRZGabzAABZt+8mvGHBsiYNF+AAw1cXEBGNUiQqWpAlArM5MSYBXgEOl0NkLcCkxak28MRKbuDMa6KDAwAUnU8HO2Q+N0SJ3OLMCA7V1S9vt7d3tSg5LNV0ACXwOekcGfreVbVVYUqMjOvyPsH71cqkxsZ7NHFJIXBTCMONMAlEryoxAfDucyOmaOpmINyaTowrK23IyDxKbNzUIYoKU3+i37OXpCESvfGCOw11uMMcCkQke4rDlrS1coOSk2VOXftERfKtZsURmLXQUqBVqiUABgrQirc0Xp4Fv4t8kxN8dLkaJQupOVcGnTN0PuQHHlRSG1Eu9tUTLOnxZ5clclsfmK078va7/WN7axomCN2e42Xc/VEIoiiM0KePeM20DTY3M22BZtuhENW1rC/NrI3WVGTmZxSKEr7V4ABAJ+53J1I3nPjAAAAAElFTkSuQmCCCg==) 0 8 0 14; +} + +/* ------------------------------------------- */ + +body.iPhone form.loginForm { + min-height: 372px; + + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + padding: 10px; +/* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png); */ + background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==); +} + +fieldset { + position: relative; + margin: 0 0 20px 0; + padding: 0; + background: #FFFFFF; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border: 1px solid #999999; + text-align: right; + font-size: 16px; +} + +.row { + position: relative; + min-height: 42px; + border-bottom: 1px solid #999999; + -webkit-border-radius: 0; + text-align: right; +} + +fieldset > .row:last-child { + border-bottom: none !important; +} + + +.row > input:not(input[type|=radio]):not(input[type|=checkbox]), +.row > div.fieldValue { + width: 100%; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + margin: 0; + border: none; +/* padding: 0px; */ + padding: 0px 10px 0 112px; + height: 42px; + background: none; + font-size: 16px; + font-weight: normal; + + color: #666a60; + -webkit-user-select: text; +} + +/*.row > span.fieldValue {*/ +.row > div.fieldValue p { +/*.row > input.fieldValue {*/ + margin: 0px; + text-align: left; + height: 40px; + vertical-align: middle; + line-height: 40px; +/* padding: 0px 10px 0 112px; */ +} + +/*body[orientation="landscape"] .row > span.fieldValue.password {*/ +body[orientation="landscape"] .row > div.fieldValue.password { +/*body[orientation="landscape"] .row > input.fieldValue.password {*/ + padding-right: 120px; +/* background: url(../images/old/iPhone/password_background.png) no-repeat 105px; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat 105px; +} + +/*.row > span.fieldValue.password {*/ +.row > div.fieldValue.password { +/*.row > input.fieldValue.password {*/ + color: rgba(255,255,255,0.5); +/* background: url(../images/old/iPhone/password_background.png) no-repeat 106px; */ + background: url(data:image/png;charset=utf-8;base64,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) no-repeat 106px; +} + +.row > div.fieldValue.password.clear { + color: #666a60; + background: none; +} + +.row > input[type|=radio], .row > input[type|=checkbox] { + margin: 7px 7px 0 0; + height: 25px; + width: 25px; +} + + +.row > label { + position: absolute; + margin: 0 0 0 14px; + line-height: 42px; + font-weight: bold; + max-width: 92px; + overflow: hidden; + white-space: nowrap; +} + +body[orientation="landscape"] .row > label { + max-width: 150px; +} + +body[orientation="landscape"] .row > input:not(input[type|=radio]):not(input[type|=checkbox]) { + padding-left: 140px; +} + +.row > img.favicon { + position: absolute; + width: 20px; + height: 20px; + top: 12px; + left: 11px; +} + +.row > span { + padding: 8px 13px; + text-align: left; + display: block; + color: #666a60; + font-size: 10pt; +} + +.row.notes { + -webkit-user-select: text; +} + +/* ------------------------------------------- */ + +.whiteButton { + margin-left: auto; + margin-right: auto; + width: 150px; + display: block; + border-width: 0 12px; + padding: 10px; + text-align: center; + font-size: 20px; + font-weight: bold; + text-decoration: inherit; + color: inherit; + +/* -webkit-border-image: url(../images/old/iPhone/whiteButton.png) 0 12 0 12; */ + -webkit-border-image: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAuCAQAAAB+dNqHAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAdAAAALgChnaVgAAAAAmJLR0QA/4ePzL8AAANhSURBVEjHnZZNaFxVFMd/5747mclMkpmxzYdJtFaJglgFpYSiBAVX7l0UUZGuSkEEu3PtSulCUXFdxYXL7kQQIWD9CsRIqdomGGOaSdJmZjKTeW/eu/e4mKRmrE3n5X83j/ve7/3POfe+d67QrTxP8QLDnMTenkv4kQ2+YZ6d/Y/Kvut+XuZVKtygzVbXC8v0cT+jXORLWneix/mAZZZwKIrSbSAIAcd5kDdZ6kaf4zzfEeLPnHrr+UeOWpMJ9rjYxe7a5ntff/YThhyneJ/Zf9Ep3uEXkhNjX50bHoiStoPE76HWiPQFfcGN+kufLKxheZJ3+aOD5vmIBaLXpz89HSVhzF2Uy2TtGxe/+JksJzjHjgCvMEHz6cnZt7dD5zlAgSlkZy7MrVDgbz43FJimhV46W2vFzutBI3aN8NJZlBbTFAKepZ/o/IszU1Gs95Tz2Uw1nFuiiTE8Rhs9fbIROt/LaISvTaO0mbIM0kTKeefoUSMDCI6SxRCT9d77XlFrCYgQi0PH72vH9CyNMSjO4tGM9do76hXB4y2KU+c8aaR41KJ4SIn6DgqgPq2rggWc+kMEjBUBVDUNKQBiOx+218Pl6tVr+jJhUZx4PYSr4XBSsAKaJH9tpirT7uIoTj3pAna43TJJWtSjYDpxp5bv5OpTb4mOq3IIX0W14ypeUq+rYBH5T9fqbRerWMClrbB4PBgUjZPUuXrUGBW51Yhc71y9LSJi1NgQxVWj3a7aw2gmONSGJtNAxC9v9+56vaoe6aubXEWy4meXe/+VXl42TvqzG4ZFCkRzv/+w3lu436/PX6NNnsUgCctjUUJwnWdGC/ZenpXw47loTRrldu3XwLkSrQmiHbkSP3FkwB4MXpjfWDE3JTfw29ZGAGHjgWJdcDW9XC/0PVS4W47fVj5cuLUmFWlOVlevei8ApVLp8bWclnWU4khpZvTRwaw5VggEINHlZuSv1mcr6zW2ZF22xqLqlWr19uYdGSkeWyn4IY5okX61GBHMrp1HJaYldW4G9Ylm7c/19a4jV6k0+fBmtjbkCwxoDovdQ0lIpEXTNIrbR6OVxWr1joNeJjM+Xhyu2+0+Z6Ocmt17Kj4bBvFgPJTUNlZX4/j/zohAJlMuF4vW5vP7Z3d2kqRW29qKuxr4P1RbNFwZtqq8AAAAAElFTkSuQmCCCg==) 0 12 0 12; + text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0; +} + +/* ------------------------------------------- */ + +body.iPhone .loginProgressPanel { + min-height: 372px; + + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + padding: 10px; +/* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png); */ + background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==); +} + +body.iPhone .loadingBar { + margin-left: auto; + margin-right: auto; + margin-top: 60px; +} + +div.loadingBar { + height: 22px; + width: 214px; +/* background: url(../images/old/loading/loadingBar.gif) no-repeat center; */ + background: url(data:image/gif;charset=utf-8;base64,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) no-repeat center; +} + +div.loadingBar div.loadingBarProgress { + height: 100%; + width: 0%; +} + +div.loadingBar div.loadingBarProgress div.loadingBarProgress_left { + height: 100%; + max-width: 8px; +/* background: url(../images/old/loading/loadingBarProgress.png) no-repeat 0; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAAAWCAYAAAC8C2KaAAAACXBIWXMAAAsSAAALEgHS3X78AAACIklEQVR4Ae3brU7DUBQH8HO6PQAazx4BRUKDwfChQTGFQ4wRFGEERdgQONRQoGEzGFISFI8w/DQSWHsP565r0xY2BiWY/ivW+530l52cdr0jwgEBCPy5AE9aUc7XV0kcl4jniGR20lj0QaAYAtzXWHgmNh7v3HTGXfOXgSWnKy6VqEZMCKZxcmiHgFCfAjrjva6XxfgUWNJc3tVBG9mBqEMAAmMFrrl+10r2pgJLTpYO9dZvNTkAZQhAYAoBNh3evz+KRsaBJccLevtXakYdOEMAAj8UCII6Hzx6dlY5nipBjXwTV1GAAAR+KiA1neHZWcOMJY35FS03bAMOCEAgl0CDG0/dMGP5by6xk2s1TIYABFRAjKufo8AyfoUkftyCDwQg8FsBloqdGmaswMf7qt9CYh4E0gLDWBrdCg7SXahBAAK5BEYZa9AnZmStXJSYDAEVENEtT/GtYNAjxl5AfDEgkFtAuGfXCDPW4N0jh9zci2IBCBRdwCTeY1kL2Z65RdYq+rcC159LQLjPFy9rdo0wY9nS+2uLSk5qI6FtxgEBCEwpEJg4flIvr2SrfEgOYxPulI4YBoFYwEiHL/2jqJ4KLNuowVXT4NqMBuAMAQh8I2DkSoPqLDnqU2DZTqmWF4mcXTxzJalQhkBGQJ+piEyL2/5DpifchJttjOpSLenmXMfVvboVBFmkgnOhBYbBJPqTuv41vx10C22Bi4fAfwt8AJe2flCLvH1PAAAAAElFTkSuQmCCCg==) no-repeat 0; +} + +div.loadingBar div.loadingBarProgress div.loadingBarProgress_right { + position: relative; + height: 100%; + margin-left: 8px; +/* background: url(../images/old/loading/loadingBarProgress.png) no-repeat right; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAAAWCAYAAAC8C2KaAAAACXBIWXMAAAsSAAALEgHS3X78AAACIklEQVR4Ae3brU7DUBQH8HO6PQAazx4BRUKDwfChQTGFQ4wRFGEERdgQONRQoGEzGFISFI8w/DQSWHsP565r0xY2BiWY/ivW+530l52cdr0jwgEBCPy5AE9aUc7XV0kcl4jniGR20lj0QaAYAtzXWHgmNh7v3HTGXfOXgSWnKy6VqEZMCKZxcmiHgFCfAjrjva6XxfgUWNJc3tVBG9mBqEMAAmMFrrl+10r2pgJLTpYO9dZvNTkAZQhAYAoBNh3evz+KRsaBJccLevtXakYdOEMAAj8UCII6Hzx6dlY5nipBjXwTV1GAAAR+KiA1neHZWcOMJY35FS03bAMOCEAgl0CDG0/dMGP5by6xk2s1TIYABFRAjKufo8AyfoUkftyCDwQg8FsBloqdGmaswMf7qt9CYh4E0gLDWBrdCg7SXahBAAK5BEYZa9AnZmStXJSYDAEVENEtT/GtYNAjxl5AfDEgkFtAuGfXCDPW4N0jh9zci2IBCBRdwCTeY1kL2Z65RdYq+rcC159LQLjPFy9rdo0wY9nS+2uLSk5qI6FtxgEBCEwpEJg4flIvr2SrfEgOYxPulI4YBoFYwEiHL/2jqJ4KLNuowVXT4NqMBuAMAQh8I2DkSoPqLDnqU2DZTqmWF4mcXTxzJalQhkBGQJ+piEyL2/5DpifchJttjOpSLenmXMfVvboVBFmkgnOhBYbBJPqTuv41vx10C22Bi4fAfwt8AJe2flCLvH1PAAAAAElFTkSuQmCCCg==) no-repeat right; + top: -22px; +} + +/* ------------------------------------------- */ + +body.iPhone .loginErrorPanel { + position: absolute; + min-height: 372px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + padding: 10px; +/* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png); */ + background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==); +} + +body.iPhone .loginErrorPanel h2 { + text-align: center; + color: red; + margin-top: 40px; +} + +/* ------------------------------------------- */ + + + + + + + + +form.cardListSearchForm { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + border-bottom: 1px solid #2d3642; + border-top: 1px solid #6d84a2; + padding: 6px; + height: 45px; +/* background: url(../images/old/iPhone/toolbar.png) #6d84a2 repeat-x; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAArCAIAAAA2QHWOAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAE1JREFUCNddjDEOgEAQAgn//5qltYWFnb1GB4vdSy4WBAYStKyb9+O0FJMYyjMyMWCC35lJM71r6vF1P07/lFSfPx6ZxNLcy1HtihzpA/RWcOj0zlDhAAAAAElFTkSuQmCCCg==) #6d84a2 repeat-x; + margin: 0px; +} + +form.cardListSearchForm input { + margin: 7px; + -webkit-appearance: searchfield; + width: 200px; +} + +ul.cardListPanel { + margin: 0px; + padding: 0px; + list-style-type: none; + min-height: 372px; +} + +li.cardListItem { + height: 43px; + border-bottom: 1px solid #cccccc; +/* background: url(../images/old/iPhone/listArrow.png) no-repeat right center; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center; + +} + +li.cardListItem a { + position: relative; + top: -22px; + left: 40px; + display: block; + white-space: nowrap; + overflow: hidden; +} + +body[orientation="portrait"] li.cardListItem a { + max-width: 250px; +} + +body[orientation="landscape"] li.cardListItem a { + max-width: 400px; +} + +li.cardListItem img { + height: 20px; + width: 20px; + padding: 12px 10px 0px 10px; +} + +li.cardListItem a { + text-decoration: none; + color: black; + font-weight: bold; + font-size: 14pt; + vertical-align: 3px; +} + + +div.cardDetailPanel { + position: absolute; + top: 45px; + min-height: 372px; + + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + padding: 10px; +/* background: #c8c8c8 url(../images/old/iPhone/pinstripes.png); */ + background: #c8c8c8 url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAABCAIAAACdaSOZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABdJREFUeNpiPHrmCgMC/GNjYwNSAAEGADdNA3dnzPlQAAAAAElFTkSuQmCCCg==); +} + +/*div.cardDetailPanel > fieldset > div.row > input.directLogin {*/ +div.cardDetailPanel > fieldset > div.row > span.directLogin { + width: 100%; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + margin: 0; + border: none; + padding: 12px 10px 0 110px; + height: 42px; + background: none; + font-size: 16px; + font-weight: normal; + + padding-left: 40px; + color: black; +/* background: url(../images/old/iPhone/listArrow.png) no-repeat right center; */ + background: url(data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAUCAYAAAB4d5a9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAKVJREFUeNpi/P//PwOtARMDHcDwsYQFRJSXl8P4dVC6CZvizs5O8i1BsqARid9Ei+BiQ2KDLKumhSU1QNyKxG+hlkXoEQ+yqAPNogpapK5KNIvaKbUIVxKeAsTvkPg5QCxETUukgfgAkqFPgdgBzVKKLIFZoIJmwR1qBRdNLEC2BJQpV9LCAmRL/gBxAtRwqlqAXqzcgRrOQE0LQIBxtNIiBQAEGAA7xCa2yF9zEgAAAABJRU5ErkJgggo=) no-repeat right center; +} + +/*body[orientation="landscape"] div.cardDetailPanel > fieldset > div.row > input.directLogin { */ +body[orientation="landscape"] div.cardDetailPanel > fieldset > div.row > span.directLogin { + padding-left: 50px; +} + +div.cardDetailPanel h2 { + margin: 0 0 8px 14px; + font-size: inherit; + font-weight: bold; + color: #4d4d70; + text-shadow: rgba(255, 255, 255, 0.75) 1px 1px 0; +} + + + + +/* body[orientation="portrait"] div.cardList { */ +body[orientation="portrait"] > * { + width: 320px; +} + +/* body[orientation="landscape"] div.cardList { */ +body[orientation="landscape"] > * { + width: 480px; +} diff --git a/frontend/gamma/css/clipperz/ie.css b/frontend/gamma/css/clipperz/ie.css new file mode 100644 index 0000000..5148ada --- /dev/null +++ b/frontend/gamma/css/clipperz/ie.css @@ -0,0 +1,356 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + + + + + + diff --git a/frontend/gamma/graphics/CoverActions.opacity b/frontend/gamma/graphics/CoverActions.opacity new file mode 100644 index 0000000000000000000000000000000000000000..58028fd281d063c9540ed2ebb4cf318cb6288715 GIT binary patch literal 25547 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 literal 0 HcmV?d00001 diff --git a/frontend/gamma/graphics/Features.opacity b/frontend/gamma/graphics/Features.opacity new file mode 100644 index 0000000000000000000000000000000000000000..8824506fe63bd56be7c0bb5ac068632f23e58bd6 GIT binary patch literal 140849 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 literal 0 HcmV?d00001 diff --git a/frontend/gamma/graphics/Marks.opacity b/frontend/gamma/graphics/Marks.opacity new file mode 100644 index 0000000000000000000000000000000000000000..4aef0255203c8822e5a42bac9114df77124ad2d9 GIT binary patch literal 25340 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 literal 0 HcmV?d00001 diff --git a/frontend/gamma/graphics/RegisterButton.opacity b/frontend/gamma/graphics/RegisterButton.opacity new file mode 100644 index 0000000000000000000000000000000000000000..d57920b06cc76d2a1d94f3457d4f5a0343aa40b4 GIT binary patch literal 44806 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 T?>U+zz5lEj@BhoEVekI{adkc- literal 0 HcmV?d00001 diff --git a/frontend/gamma/graphics/Tips.opacity b/frontend/gamma/graphics/Tips.opacity new file mode 100644 index 0000000000000000000000000000000000000000..56492c668e155afe051a1b535e1de9b862356828 GIT binary patch literal 46046 zcmc$H2VfM%_y5l9-rerr?%nRClimv{cPTU}fzTxoNFjh2kK}+r8Yxu49Z<1g0edGD zQBYI_6j8CEq9PVh5f!nESW#3|_`lh^TnRxy{r$galDpm6Det{`pPA2_nZ21|m?=$l zwJoi7`(6eym|+=?F)&73AKQ7ANwZzeEwzmel}U|LX1J8a^VVam(Of%EMv@&ybCCI*`HK0T`GGmc{L1{noJ3J58Wo}8=zKH=m7&R~8r7mYRF4`^BWgmk&>XY? z-GFXJx1qby8nhlggdRqZpvTd(Xg7Kr?MLsUkI+H%8TtcjGfqp=VJ{MycjRRH{x6H?f7}T8^4bC z;5YD_cprWTzl#sxkMU>t8~h7C&T_2CDy+(eu%T=u8^xxv>1+nuoy}w&Y(CqI?alUK zhp^|fW7%@Hg1vyfh;^}Z*oEvO_7YZOm$Nsrx3G7ztJt;d26iL+5c@Fu2)mWt#lFVw zVfV7{vmdgbvY)Y^vxnJl*dy#o4s!-hi(DNvP0}Y{)`A4cP{VA=i*+=w%pS7;G46 zC^3vRlpCfSW*V9dvkey;h+(l|iQy{4jfUF|D-G?2wT62Q8w?K^HW?l@Y&PsL>@>V; zc+K#J;Z4K4hW88~7(O=qWcbbSyWzOu52IwX8haWC8V4DRjDw9sj3bOAjprN37|V>6 z#wug2vB5akxX5^^@iOC;#;c6i8SgOOX}rsLxA7k1YU3K?TI0jUt;Q#f&lsOIzGQsW z_=fQl<5$M7jfaij82>b$G+~p;B%2gds42qK%@k>hGR2$nO+8J0Oan|qOv6p1O=Cj-I=-H7;9K~4{3ZMn{$~C*{%(E^zn*`Hf0%!S-@-r1zsSGD zzskSGf5?Bzf6X7}zvI8>f8meu$N3Y2MX(BSLZXl+WDEI1FX4P)v`{Kc5UPY4!6i%; zW(jkIg~B3Xv9LtALRcZ(D%>sHBdiwI2=@z*2%CgQh0Ve?;aTB1;d$W&VW;qh@Q(0- z@S$)>_(b?h_*(c@_)%m%^D2dTxoH$$@Czgt3V!2o$P827J7l;>$F0oc@66cGT zh*yf&i8qNii?@q+h%3bh#0SNV;zQ!Y;%0G+xK(^sd`a9bzA3&Xz9)Vl9ukj=zl+Dk zKg2)HvRN?)nZwO7=6G|eIm6uDoN3N7=bDF@hnvqgmzXQe6Uua|F;+vR)ZhvlvElk!vYv+{HDOY+k4fQ2t8(PX1Z`P5xaz zX<;qArJE(r5^qVcBwF$rIs?w1WTQz(b8<0V_9g?ESFoB zTCT8MW4YFHon@6}t>r$;gO*1v+bmC5wp*UDJZpK|vfuK)<$&b_%eR&vEJrQBSx#6v ztI5h+1*>e0vnEp<%e>u~D`>nQ6O>o{wTwbj~Yoo$_Cook(E zoo`)aU2MI=dZqOm>$TSFthZQiwXU?bTi00ETJN=Pus&ja%=)j?!bqGDDgMOJJ|HziU@P%?0^lB?t?=P5$_nLXx4S*P5m+^;;OJf%FX>`>lR4k@22Un}1# zN0pzI-;_U;Kb4azqau}4L)8>DRZUaV)eN<}nyK2=e6^R_Umc(pssq&_>Tq?0I#Rtz zb*fX;YPCjnsZ-Ty>U5@M!as8@91Fj_GYP*o?L$Te2<1mTF70rQ0%W-EEn+EL*lMhnZ-z+Z?uB zTb?byJgK3ruI`{>X9PxM%#6gyjD@i>3ZpVMCWr}ULYPn{j0tBVm~KoY6U9U`F-$BI z$HX%UOd^xSBr_>YDwD>fGZ{>GCX>lxvY8yl&N!G{CXdNy3YZ>DPo@{so9V-x2S0t8 zeoTM(uaFtY41(`{m?CB{GlUt+3}c4Fw-L-p=6q%ph-@^ZDq+Sl<&A@;ji@heayC~qlsHRUo5wq=TSqzPwUoCslumCM-{fj2qtDhi)|Aa}Y^*PH z*42%xXmQRiZ5>=z?`m~cv^3QYc2!qQb2W^1)|WRnL+T1Bah$WJY-+Q!rM$Mjw03^^ zlxancb+m|~wRIIq)pgF6mI^4TtQj(J&Ms*lT-NGrZmFnlYaZI{EOj+hRMgcrxXPwi zINMqq2bGn#OovKUHp7ss2y&*)s4Xso)Z@lO`K7LDEoH4x*!Zcnb?|UYdA+l?p{N2b zl{HVJnU0wV(=strb>b2-~71YgcJ7P~!>OtVJdc z_yGol@K2Knd%1=a3(Gv;KlI(Q5_T40n+5F;4RTmZ*b$nd+~U2@6SgtY{S?C}S(>bf zka6J%PeuiVZPFs?lRbIG^fnlgij977rfL>Z&iRZLM=%==n0Rt#x{1b4!(?crFw*HqC3Uoi@F7 z!f4l=xDoZvX|A`R(5XxtGg}kdnK>F?rGyTvZL6zoj4N`rIGbH@rHysY=El0(x0w0N z0_I|7;Y7C%8=Up7O7}-s3)FUCbF*{aDoC)Xa&##O9rRVDgn3Jh%e6b~aYc2tO--)m z`R>dJv$#qL8eLl4*6N&6=NepF-3kM2XY;((3}Kcqi!K;l>bura(aUK?Cus6ssQ8u8 zHLqf>W|qN!*Ou0}>Po>nG>e8bK7nBr@bG0) zdUq6cvnH&94tJ}j5VYkT=62=|C^Le&6H2`cI_y2nN~WDzR#r#*Ox?ihQ7z@phT8fv zEtuNReoajruwt z+iT3Ya*%dI&G>p}%S^ETa#u}p%S`8o#wKSq zuZ3#Sf)=AiY4Lnw;RKHzEBl~qcex69p*NtULChBDN@0*NQVa35{vGB$&D_qstA)2S z`?UzKmS_s9%MYNkA8FmRQ12bL{yt_7RVmhzqCvH-_0A@!SgUJp>l)@0=2PY~X3?p) zCYBTpZg$S0W_5~Mztn`4?p(iS4o@yA8r|4j@2rESyPDTB-!Mm*Z<+6yMS(ZQmlWv< zy2`hrwQ<_CI+w4JKQTYkMjq8-+nHaqIB!#YjoiWLT_HMz>(iOGtRy+Gj4$+H#4rs!i5Kw5EO%AQ5=d#3DAs0 zl!TH|3Q9$3C>_%p1i3|d@P>Krnwf;Jsm*b2A=A1Ms!&p68A z+lcy##@6X@t#sOuS@goN=F;XNvr4DHx29>M+v+Q6rll~mFNK?07MOd5rrW!grR8c4 z1p{1UfsLnX30jVpt=Sc%r3s*8G#Cv*LqQ9}z=1&ljm-eE)h_Un zGy;u;t9p`EXauv!{qQI>6k0gCe01r!VS}`kQTFT}ah@M|4%{^=L1VSdRcIV4)zY=@ z`)J=m<){LUN0mrH6QK+CEv;*;u5i}1(gs#H)@d19l22)jmh7&;g{bPnlA>YI&{|hR zD{br=bP;l*Da@iy*Sj+O&IM1UYSK&cdIk`WyQCRt=7nBQuVck(G=ri=#R5Aum$CM- zt>Ybbdt6prYbpG7Kh=x?y+Yl6xdM!`v6-5(tGTt-)v^Y)qBb;}_WskP=&H^g0-UF1 zwxju4{y`-IU96jDJQ%3YJk!8Dsc|kui@-oH0TUhXHBt@r)Xmg^E(L?U%wwkgkpo@H zoB)qojQXK#;O}IQu`Wj|%Br1BrKL@cFeqvO=UO_awx+zs*)qKp3`@)MnN~l|0Vb8D z_0SRoEywF0v;t~iT2HNyzkS^VretUQjpkO}T=KzO^dGOe+(FIdPIQ;nOY0q|wfU$W z%w;lYE#Kch3Oc7+2fDpdPvxiE9v;7i9ss0752B6Qd0OAZ!ZmX-~tHyl|P{sYBDcL8?L zJKCUj^qyAaH6EHm$5tryLx7z^@13$~&9yZhIy^*m_zC({8>&q@5Kw)4NA*3G{{npp zRsR|thRPpdw({CA?R-HSrA_p!_JDvP0s4Vf8+`)R9W|{sNtVY7g_?sZxT6)z#Lx;>NkA)`41FHF0INb*{Y_F$owm3T82f4d@dJ1f$EG zt*tFuu{J>)tqp}Ii$>_rdLN}vdMkrPENkXf*o-A@j8?J=Td-9dtBspj+tAe3I=;51 zb^0XzV-dJZS94;a+tQi6IM`FPghO!{`nnXx?pldfsg-J@e7Q&B7@B(&j@HVw@>Mt% z$7vPX_)0sB)Efu3wpKbkAG}>Bu~2arq4y!2f>ZV0QPf!9ROgyIw6+dv0S`9UPHAg( zt;K0L9cSR~o<7udDv&`*k@uOJj$u+)cI+-R3ulA1yUSXGbFdvdV36N&<@C?x;d~fG zxu0{7u5bbFfqUX!`sm8<#@~&u&M>&e=i$CgG49Xo!Z0AhgQz)Ppj{+rPO!6@(;6fm zsvG2|V33n_gPi2k(kMI{3=$V>7q;UuT9w!AyaownmVrTD;Jq_(inDs=wC2XPh8kZs zm3Sh}W`Z`Q9Z%A#y@|cqpil8dkj*6T9Zyfh)i4UgHJa<7q9Q499EhjlX?`O?GoFrX z-6KI<4`OHp5zNBPxCOW3HuNc6nTzLDR5vy^jH`72nNVI+TR-Z2t(K1OX7~ngzVV&c z_Oz!60#?KGPn+aRtWEVb^J2V+HglmitsP&YO`l8)b2X2H5k*@|Wx%%yRf=ta8|`6m znCAf8|0knEe7XPV5MPBHcp1J1*SJTAcsVM>E12R_2W;9*z}0%KPIKwQwUgSPp1~R& zZ}r4CYbj%t6nl1FFMD3^Tu1M`UVx(XQ$dejy?awcEy(X}cl7R^m*)?;__j_XwEs`^ z5x#@zgYWdvN5!}uCR~6lcr{+b^vCz&b(B8B_v7_=1AYLIhSEpS)pv{Kv($FOjGFLmGeW0@-kR(!@ z=g)y??|Y31D3CddK(j2J^->(a+;P_Ac7x;#g6v0`H zH}Tp+jR@M}00f^GfZ(i=I!yccJNv-M{8?oZLHUy(kFA!J-}V4_Bj2&?7TcX{YU3@32ZK# zhYHI^myQ^$U9BT1Tfp`RmUyT;@{aSc=THDqaIUbr+}%l)ohJ+v-b2^!5ll)4Rh=aXmuU5xPfiN zE$l3|8UGGf+Su9J?G)1P@S#+fkfz=1bw=8?zO>pczQ)XB7tqGc*KTcRFV=1gz_6|m zEk84^K&Lw#nQ;#LIr1GWfwnAxsbgUW-@z_ruVDJKSFzP@L}RZ7E4&U6Z4GEOfP&EO z)K-Hc?*buG0%EOpw;!SvvNuo@1>owHSCHE~-;qZ@_R6JS3gBb!T#9G8{#eH97#I&w z*E_FA&jJUXLlzYDa5xI=^x>Yp?F9w-J@PwdmF#UWt7LCy@6hhi+5_f`>f$W;`98WECs~#(aSzyJycHc|BZNjsmLR4sJp>U{u0BO547f-J-429{q$Qjd1@Y=R+rsPgiAYdSFNdRNk9_xNNH-+PM&s3_0#H0=H`0{p7?UDktcgxxOBp+p7l{bwMr_l-@&fd-(Te zj`KW{uVa(lLDQZ3u|toX3G~SEoS;3XJszmXEu0L4L&_07>J=IIoj{I=-NFTdR({b_ z`Dta#>9xXj1Fdk8pp_@7R^r?itV1Rj%f;!znd(+I&9aV*=MuO?E{RL#Qapj1j(h)( ztntDRm*(T!x%9wU7MDTchs$D$xg7WblA6oo^0@-82ZbN5H`iypb4UZ_pvOZf)d_#K z=Xf6g3EJ~Mtnppe-ql|7Nz@;Xc7X2Pv<}yg8vt;`_1B(h=L)rFC$!Ygcj-*TMEYsC zi^lVG;vHyrfFH`cgBLqzAmWBVn}+!V5qCZ}is{ddW<66Y>W8>e0HRk<0iqYQSHK{4 zYEOHB=tX}Z;>LRnv7kqOPkTXcYKXmh>Q0^ZckuIc%9S5ryA#jKEqI(UH<_C5g2f(-H5erYqUU|#DgdI+scNC2Gxby+Hws~3ZI^!sY@jvzPoSiu)-6CmbFJF$ zf9QR<+0^@R^ZdOJw~$)|>eAtZTg>#~mbkqScR9CI+t-En*{ki*o~H2O^**ob-scVN z9skDbquq1DYX7IN@#sG3d=+U@H$jP{m)VRxLJv31TE#w*++J!3!LwP!pa3dNI(1^OQknsE2}`7O7*TF-6J zS>_>i5aDj|u-ogn2e=2hjod@r!`vetmN_87zjIt2wSk~;J52hnb=TxE?s1^gU@1kt zYc02pdxG1}J;^NUxCA4clA>Z*yiwz9b-JV7T@!eEn2Fn=Wv;ATkeinoms_yVEoD8l z#XYa341um&z|a`~h@$DP>Y1+QDUHtNnqe-Wf1D7h@mI=Ap6-0sLs9M(j~dT_cL$YV z?lmTX+s(bs?Lo=h8{C`RTin}p+R5$Z_HplU?{e>P`?>eI1K_4V6Afi)vVrLd9(*2~m4m6lJV3tY-!wM)@( zxKiUPt*EJO8Ro1nqw8fVTytq?O209xys2dLurXy#^g>fJ%<}ZhLo1vOqZ%8F1ns!? zt2U3$_n?!We;`2*2K>kYM}9B&6L*yRnfrx1#{H^& zqJ64;rhTq`p?!HT)0aEW{lWdo{l%TolC`h2ueHP4x7v4AO2W*dVfs3c!LF9p+6E_G z`!L8$R_gQ5iUlKwju^VIe8DjIU9q5S#8CPL8UVxKj4mD@)!5Q9k5bF9)`BjG9^2-u zt8Jai|W(cRxB@Q_98vVDs zN{IzcWY+;70}ERy9g|HLB|zaFeSL31<=$4-$#t;w0yCIhQMf*wn ze3c==kfs3>Z12pL%yK^IEE6>+6G^M zbG4y|0eFHg?*aYZu~r3wT!!9;KG4H;MXxoSXXtC_XXvkYdi~P5b$Y`<@V|yZh9d1R z?L>f^#Px<@&};gFo1EeAf0H|>g1&{X(Np<3)4EPmC_^dWpP`H(^bY~h9fLJY@CQKT zFkFahfC_~etYHfLg%~WQgbh;-)4C3|5`;C^DY4d*1hE7e!6>|XozZn{)lg5x)nI5O zh$F}lAPPg7p~XFNhF1DZEO6)y$>uTr4Hs$|G?`CiP&JQ_H!K3gF}_!!OTR z*_)@^k}fq|Mk6k|@w+1~hRY304ObYhbVpo#H~uc-^0(BXVVU6?rr2;Dr49`%m~pUH z&P!si!`;*!+(nSwZn%dai+40a)94H$ z6uU<224#6~0o)Fm3jy^uSfe(uW(M$cUK-J`4mJkd&pbwus!brs28BTvC>qg`-ksc6 z{zk*YwETw%3TihzLQwE{oedmPkvQOE_i*qGWSn8E;V}@(HfEP$JBZ~eT`Zvlbpx?P zYEcBm_z`lQB=f8;na8PQ^wm+m+OnXHcjJC8@%73UcM<5L2*7I{cJc! zoAwJq@$H6R2}(F4W2dh;`8P2r!->u@C?jVy7!JA_JGw&2D4s3`MNkSs$skO9u4E_Z zKL5#*(el5ECmCU}pi%9JCmBQC@g!roF@ouDj5J2kc#<*37;B6(#{1$)##CdPF`X$i zb~k1kvy9m^o@BHeVZD}rJc*zc1TFVOln7ep7g8c9hgyDWS3xC$90XlU&~@Ip5<$8C zfhB^j@tTK{MUdSuutd=HFs6dFwf>PMV{cNg8~Ymv7z+vN zPEaO6+5cU9$v6x;j&V3aS?3yHG8WS(v!P9X5hk!P&RD8hbPG!Hc3=-i7%S)_sUV|( zAd_(dDDxiU1;)unz^8mF{`~~ydE-ownYSw$okrK0< zjI)?xV+%zM<7{IpphgdZ`hW{K&mT3Q?g2q3<9zBIjdj#Sdb(kwz*kw#xET7qkr33Y z-MECH-d>4#T^f{o1$AjXytn=)@?^XQN`lA}L0}txyw!M{@ph;JK?4aIL{QPc2sRm4oi46)&ha7RI^%sH@%79u;{zb`jk?T- z5HuWQK7vBh`94TGMeLh&vDZ_v4|R)uuutrd8=vrreLF$Je9~TL+(D&1#4GJnB1OjM zjXQl$zevzX-_!NRSLoA&y-#--+HPuSuN(IeG>V{>v%(^+M zKQMl1gmn_ekBx^2D$y}$tPfRu#GKcyPz<`j`wc4ROHEL*Pbi-mzo589`Pk6sh^B+?Tl|Za1j-bf|)&9dtkST$( zfTm>sNsuYslmT|2vw)^-rjIEH^{4h=$~EN?~9HGrw?A3#(`Hdm6~7zJB^^}|5;GURH-X;Qh-9MOc!|-3bR|2%cIcgrdooU zx>6`iM`wBz+Cl9SG{d9NI)Y~T%dC#d?3{v2rbf>rT||_C_2{_T!ReZssa{)5tpvev zp&?MOai+N)ljK@Iy>^N(nc_@~KuH%-CDjH@l4t&nk}ji4x|}MhSyz&0-t5H??r&l~ zrmHB1m|(hVg7CX(Iefl>%QxL*x|w2#={6I<{v7`x4?%N%@ZbXz?OlS1w_%+yq!skw zCaFw!neG7$G2Km2Tf1o`L9_p_LOrIn(3Exl=waGmdH{sG(YVKl9;QbrdT6Jj$2@{A zq0V?dfUy@n7Wkuw=`oLWoPET{^u$^9TYX4?N=#2tdwSZmgP@BES{P_g*O{J&w&>_F zH^5LTI;YzO>0YGi+A#lp7$!Xq{-5~&j=H}Myq9S&L5u&X%YR4r5c>l>#D}Jj zKzVML{|R`APdy&u3loe+uIkD|TuIQSph5rO4?#;j9^x{BuJ-p3hpBeX32XhI{?=m- zXBPl6{Xmubqv zfp}wpbMcH;c{81cftMTX(Kl~BO%R0->IkCvRhKpcb5;qAPG&*k&@e1dKy2qslG6Lbqfw-R(4L^JrFd@sH?--ka>OC|{1>>UK% zNf3C(d;TXO4Sp~`Bp`yp59db&UKqvGMdLhp%)3sBY53Y-%9ovEM8o&&1pWdDOYjr< zT!L1Cv>-6SU#J}=Xmyui41Nj^b9tH`#&(c?&AA3L_?hPt$k5}3d=vCseijc{dp|+z z1G<;tbAGlvcmTYgU(eM7qX&@eVwlGmXfI3(@ZPXx&0Poq|H&^V=z)LeKizQyeyP9z zL=JwL;UL5dAa1~44}U#-xA+_Rn@$%ucn~}n;Hp2Fx)R9{vsfO@f{vXfMIb2)_9Y%saoAhZ#Qq zF0+f@58mnkb1S$aASHGH&G8JSIiB~YIkp6_OZ-7fbMUWIXZ56;=6J%_-9G2Pq#gPT zf}U#Uzar>qFD*gS=s^i6{9DRcZ1>(eh40{h~g!#+fJ%tNESOclBUJDS`ZjU(&PVhy-6rq}+ zw+MRsR9|%3ZIi+@kOFL*6lw)n{tZ4FwoM9+42%}uhwi?Qp#7b8O~QE%0bN~a(YyK{ z+ST82clEvAt}e_I=z?!yK0)uc3oxH}&)X5beH2P2w2$ud-tyl&DbQ)AaJjIQpaTRQ z`CBSnxJtMh`sg*33Ky;iheyx{1bqzt>QEpRzBjN1H_{dem(vz}=x)IQUkh#*?xZb% zVbVwK0szWEZ#8`_xJp<>TkwJR7VNG#<2FiR9TW+hCkgrl+U6^8gRl_>7s3MqfZ(SD zeYQ$?NO+i_&k6eCtoKR^58_baG2t3`T&pAq<|&7K1#B0drUg7HJVg+A->+8*JA`Kl zI!w?vXR}@M46q@*B)kktc!k*|yasBZxI@sl1pNqV_=&>CFaEI6NfU4BnpjFT@ts=} zM||~uPk5hd0#Ne%b^(mx2d}t&ns`b0m}=r%@2!bbyi0O?IejKjN?8Dr9&HyuI6r%n z`*K<;9HBWK@!sm_YTpBL2tN>X%*%BAUBp)S$<3Av$3Q5*fk2K6f8ZA3FX4o+lqnXG zhzUBb1IQm;0f^6oK1J{n?>DHIFEv5GdYdL1L=!Yk1n&2@b`d21`x)8te;u(Et^W8! zcMXamVyN(g8-K)Zs8EdT5`SRVAVGk^e}XV|wgWFF_!55v5@S0d(Eq0`fMPt;M@;Al z*@~&|kgb?5W-$H5OfidwY{eYWE;__qU&vPMCH5A`~6lq|u9|1M-JRzlAaClJh?Ysgl-kUlv8 z+T<6q1tSX)YiP(8Oz5x9-Bg@LAL&J~5HRW%XMi&A5$nYUF@#_<0rBrASoDs%Atzs7 zY8GdoSw0@OAYKeOB`y>f5iAiL`L{SF5^*u~{YxoMiA%*^pjeq;RUp_FfKylqz$x)+ z>K(;}U?SL}dq*t!D!W{~fp+{A1Y6t18wpmt67l*pDEBt-X;}8&`kRogcsGlfsifs9Z&?7^Q9&@ z$tRRw#9wK%juD*PF8)Sv${9iEUxjSNzo1Dc{YiH-Yv!2#W~1m?He?o2q1gQcSH`&akRj5qLDk7k_4rsxJ&V)XmO5zDe1J7|Aeyd6tXqv zPzl)04ubOuF8qgcK64)B@6GgZEAQDs=04{0zz%f&-aLTmV=hGfb$ci>4<@*87yLaw zkKi6)3;`iq4Ce$943^Q8;C}uh>4=J+y={!7LOhF*t+|-WWVCq7#*WI9OwqxyB3wl>P({_|HPN zW;lWa6j~Rc&?fUNuR_~Ep|d>-ooAj;@UX5FI+Wl+9))^Cws@dNp+y7__m|m1DzkG6 z*_t)aBOSq6zc{Vm#|}!syoBoYQuAd5g9Q!=)T_gMrH2y0g?_!gQ^?lrFkc5snnjgV z7@(vZ17;s-zLRlFlV$YrcbGi1}`&*t`;cR>9{rT)z2U^E!$l=JjTP{m}s- zTRg@G4?Zw~kS(tCHmnndoDX_%$1}_u&2;6k`5}TwwVNLyxcL7nWNY3EO?f;3J)Shf zu^r|e;>YeOjP5O7py)CFRP-nz7?uDLJQl#%iyq?w(Box~b)0?3*4(kF`0x9zJ|sXT z=GUn`?J>VWa4ErMf%df0ycgP{qsN#4L&@r#?tMu20X3*GUiHw1mHYRNgS09CiU04Y z`)5G&nLj6Z!asHSunZbJ#NhxB@tyg5P@dc69|aHbv&TdHYKGB>vnvmA5y6u{g8?C1 zJkjGJE+E){A&gm%fu0lA`pZyX{{{Z#>_WB@0_93rg1Ojaf~x|R_PJzY`bz>;+Jpe5 zUFcV!B%Pi8b_X#O^Tw^FqjlYdh{*DohD=}C3O+9 zl~QTd&t>2xWq2C<--c|ZY_S(pC^%;)BG zglzw!6LIK8a|vEZ@C<_K3JAB0lLkmbA!I8RN&}@qQjs)R8ba_)g6jybC%A#&MuM9l zWGfAqMo1&2^QBQ*GQqP5ZYH>e;5LG1|4%};Qn^$S5TTVONN`4p-?lVqvQ!1mTe^_o z*3*YoXQIw>@0lJ=l^~kBN?I%}Ay^}r1avRqn6$JbO!9|c&+Qy0IVN2Lj8iD|LiC5f z_eOtq8b3=nfFG4$-hb&o^rP<3t#q5eA4Lx7ZUN3L4(21l3rOD!;V3&~*XsdP8> zU6=Yx4PVybmYxP@CGC)&A^0kSuRb+i^0)krv{Qm3CZ(4teJh5XyUJzN(#+5mZfvd$+aAz(L;bZLCiY-^nH_2j5}v zU9tSKS%w2A+hw5R?rN7U1mAsXPW+p45Y6dk?=6pk$f1B+au~rY&x&A?Bisaw9L*HV zu}q;HFDKv@IZ00D--Ih^ayr3lbb@7VS7TzIDL+M6-#Ii;FJEec+r2`PGv#dBv@C*G zwaYmKuRbHe@~>HbxkqP~U+ydSlf&FYWO*Peln0%b<;Uv?2Ci_WK0szO37hUeK$eI8 zZ&-dASbTXz2g@&y28JGDp>l~lmgz5-%4L-0mn-D)a-}@M$MVZn@917)}7K#ucePvfs6uJet9`4^B(y|`6jt9 z!CMH3e?P&SeJnrrEu52YlkYmSd^+61YQPP7jl7oNtpxApO(xHPl2NcYDXJzK;L6Om_&$+X&v)E^jB;x3Gn#(NO}* zeTMq9$GpP&8MZud z6qMw(RO~Og#lF)g_8;V*d}4<|=F2{5AC!Nk(tgn^?NeBO`49Oo-_s`ue%1H%S_`I6 z@AN+HF*J(-49#M+m@N}q-+ z<%1O;G2?YBl;!`>`wc4ROHJ_WUZGf`EO6vmOT-;xAPO7Z7u zEEyJ9Yh=l?7~LRbfusH`5RWDJ04O?eV-|j!;P$v%WBD!D>k7RgK%uu-ZuKhkPEhDw9)+&7v=jVeR|@@s z;3FP|`dI#NJPQ4m;Gg_urk{~{PAtD=9ThX}?WZ2~*9FUOSx@!4!2%0iRHIcTDF3c;8ZT?ECCbQBY&f$r>K&irb+^&0wtXb%Wrv(Vu)oY;KfVu z1B(GIuX6d8-ImvN40+Q6u>V^i%m2F%9(-T|EI*6A4eNv;DzYZ}||KaxefrKDB%X!u`Tx@&|m<|&vI@L!5RrG`AY#-Kc8bn-T&!ik2#zj%Wq8s zojP#VknD~+WGyLSu?ta+XS&tQL@v+fC5Q+^S$ z_Co>I&^60%?H}M=boDZA)*?C$gGtfO4t)kVm){Cr8)YCeJJ7TSNv;1rd%sAl%gz+AhpUzDmfnLNW5H^*t z!GukN=DA&*b*dGZ>U*uztkbQv)*05B);hw55H^&sVT27QYy@Gu0n2Y~v^H61S(~l! zu0+B{5;lsk(S!v{j{Bdm{ML)D3j;`ft7avE7cRA44$j+p8DV2i&+=QZwl4dpEWdTR z^+sUrtt+fE2%8Af0@mJoGqC(@QkN{h^>!=FpE< z3!NzNjbU=MbtAw$oa#pKTECv#iRFi6n}Koa=T7F=3-P_3#?RI#s2|-<*zAAkN8K#H z^%;LZ3VwB`9Oh>Et-IVTKjrhRyREOEhUI60b6j}}%TI|tJ7M$uyY`!1v;5Y*RBHRI z?-15OSU8%--`{PwLMWPnLy@7K{!$BM`K{Zna8|W-r#qRS)YzO3xAZwUE9)25FA1AZ z*aGiJ$eU+Jx+CDeU~d$@x#PkQ^uZskKM}SUVGG~0{>(gW{RMn&GEgkZXgn1AEByQp zvRY>SgXvpF-}G8qJ)JHDV0+VF12ja~K3Z~xQ$GmO;}#VL)Th9m^Stgs;S^Y~y-G1C z06%>R+i#V^BZaX2wIuqYql!lTb)Rs^CA{lSKZ#DUC{{REw8Gh3OJBjbT2U00S>$)c zdwyXT)mDN#s;z`$cp)oc2YPEeNSg^qxj6?pJKnbwQ1fUlbBz+C#42%0JYkCnJD9M; z2ul~vxc!`xq@;Fkh~aZ+2y8a=CCXHCXre47o3KL&I}}@65 zjAhKqI2il(SIQN-C#R1BheZJCyG*}!Av0)#vkhLkTSU(tbvBJ?aDdKRr1$V zt1^_C0BvqkW}%)+Gj~L3@gUrVngRefiLe*Yb5ucgnoO%cnXpxa9ZlGad@7i&08rek z%u(hl^OX6@0_9@Djv;IbVaF179AQfdTXwIqNV$aRs}N@ZbjnQ~14o+;NW%L6amsN58I;a25#Ks@C(!cI5^@%+wGwRz4; zZE0+4u6AY76Kzj(e5$faS?wvJV<4y8+ZltZb-h<9-go>~l@wQ%kEn9nLlw1$D$l!Z z;lxs9y|Q5f990P~f^KY{w?=tDc~IHNEb?9I>Qv%0cZ*G)Zn4F$TWp6g9<_=Zk6~AP z4cm1Z!%jP+Vbh(g|G=)FV{Q$w>tVWG@7C>l57_k^9=ooG{c8b+J;iOC~`m2|I(ZGktk|s(cn`N?$4vg7sT7p?sqp z3B2&V0B4Nh`-V}8astNe6IxvKwSRE- zaAn79#Go|DTtAyyWjjXi=je7+6LmYP*fFpMw+e1YwW&d^#EGzgLY@KL^|9jlI0OVu(JocmJ3UP0I^ z340Y`uO{p=!d^qzYYBVZ{pxtNQk|eqgufT4li@S?|LY06oUkhhdxQS@M#A2tUs(?4 zGs79-^{$dydIow$ZA&eTcqUJW_fvKZe_AHNq0jKTEB#P*NM1)@HC<8bnlrez9$r}w zc07?LAJ?2TWT|tpth*3@Omom zDi&Q}+x7pn`^Md~Gly@jy15*BdgcEa94SeVY-McBLV z1F0=mml!hD%iz;e6=V#uyN9qVH5f#->)%!pb~U`qb#&?Q#^&1j@HTH}UEMtQJ2hQ3 zli|h3^raTX&gN;g4N$XDuBo0cRZ58W8F**46YlGWcf(fJ(WMpiy};F{z3eMs(&$n+ zi@=>dyp(uQV=J8M?f#lD=z50n{Mt-E!7qJ8tKO{M0?(CnXk?XoE3?S|f=^s`sP}5- z_3EAKUFzNHJ?cueU0tQFR@bO&341SL*AezU!ro8V^@QC(*aryvAYnHW_M!FaI`uyF zes#SvRDD2wP~E6Lq~1-~hY1Ve_N|0{S|1$lAnXf-eTA?eKt5GU_UTSUhqK9NgNbF= z!lC62u2NSk9REHI-lm*(rU$^cf>pLc(u6Z5ZL2+t{G3fq@M7s^*Z8S!u&+`Q&y?>R z*OV$HVYjTN{zHGr?Jp|e-RrGwE#p01x~!(L z+6Tevo9aHA#arrHbuVEb1G6CPXQ#=15NgDswEg!-W- ztX4l#52}Fj+X?$5VW08_Z4(FltUCcFalmix559_jq0*&Re(m$!I--6La~Jhn^*h2o zL)d3msXwSc681U5K0n@BQ$t?@P+nW_oCfkuoZi~n)F&s$|A2lFd5-6h{v1$iPL+~* z7OC_Mvzr>G`RehT3i0VR>hBIwCvjbZu{7Nq_%VRvcCm2gsj zOH*TOWygmJiG@>E>dp2}ti5^Lcw4Aue$Xb^M4K7%f6HdES#630^L?-2G~ z!oEk~eORDIaD(sbzu^P?f582@ycvcy6Uyqq-{~L6Pik<^9^`C>H`v#?^edIHn9glK z#jb`n{rUwSL(;!Yba!`nQH4AG@Coq7`Fi~peY<;NVZO%(3TxdT6bK`DuMKry^9iPh z4Q99gb^*nYERtUt_-AyxP3hd>?E$*>2upe%`#({E~T>`7QGS^H=8Y&3{S; z$s#FIh!iGulk%iqQh!)iJrovDpDz_l6;h?-lBP)wQj^pywMq-5h0-Mwk(Nr=ODm+C zq+6tw(kf|#^q};Rv`N|`eIXr@ewL2QST@R{tjHm9H#t_0lN0F5J~>rRm%GDKyaKtW zJW3u7>&C{(Ww2hX8dil(muJZJa-%#~zD!;!Un#GU?~osqx5_WeZ_6LZpUYp$U&%kp zCoLi@%ZRgdx8z&SvkbS4v=m#$SjJh(ER!uWEOnL!%N&blS!}t?vefd5<#o$jmiH|O zEuUJxv>dVg1fifmt;lMyidHj(2xP0(s#qhe-K>e$WNWI`Zq2pkS^HZ1Tg$8)tedP` ztxsEDup`H!j#!Ucf3^OlARwR2O0W{HbWR@#!j2FkkSn&dNrrHccp9L`NxlFxMU7>DJH>7{afRN!KBSWe}oFUaAu8?UV zwIQ=Z=7uZ?Ss0>)EDpIk3gyLYIbKA9`Ep zs?euGUk?2=^mv#d%n}wB78jNtmK)YDY-re+u*qT5!)Avq3cE6FMcDIUFND1q_Hx*+ zuvf!&hwTY_BW!=zfv_LKehT|J>{!@uVaLNw;X=3+ZV6YzgTkZ2)5E)mXNC6&9~eG5 zyd=Cdyga-zd}4TYcvEQ`X^xa5t&vKk zEiyPVIx;pgJ~A;fGcr4}XJqfl^CJ62_Kz%#927Y?a%kl6$dQqyk!6t;kyVk-$m&Q} ztP$H$>hPc}wKokt-utMXrf_B=VWawCxSzdqww&?iW2EdQkM>=;G*!(HBHt7(FezE&B54E26K8UKV|A^xEi6 z(VL^6irx|ZZ1nTdJELEZek1y==)KYJM1K$Vv}RDV*AAQjU5m>Fm`b4(Ad)0^4RgQ7sb}b&Wvq}ZH{e?-5&c? z?9;J3VxNh9F82A@*J5|az7u;e_E7Anu}5ORi~TX2Lik}=`6<-(M5Pw(vrufbATjO`cKO6si{2TFa#h*wpCPXB} zCuAgKCO8uE5(*OTOt?GYo`m*<^$8CoY)p7KVN=59gslmWC2UK0F5!iQ7ZYAicqQSr zg#8Hz5>6zV6XnG2iTQ~=63o#;wzPHauQCGmm8jfoE@ZcE&r z_*CLciEkwCPdt$LapEV5pCx{qcr0mhQdQDLNmG($CeP03NoG0Abs>B-%bvyulT4^AGM zJSKT;a%uA9SL+f zQlCzJCiS`0cT@ML9!UKx^^4T6QvXUlnTFEDG%3xJ7MT{EHX?0oT1{GgT4P#sT5H;Y zv=7rhO8YqN>$GpuzD@f+?Z>pEX}_c$OZzPyrL*aVbW^&JZcYzR@0LCyy&}Cb{o?e? z(wC+$OTRY#`t-Hw>(cK}-;};NeQWyj={wWEPCt>sWZ(>QhMZx|2+N4cNXMnlGejO#LP%~+lBK*pAg$1lX-jQotgJ% zZpeHv^P$W~G9S&{lKEWb3z;uwzMT0==4+X+XCBQwp2cLDvgE8jS;MkMWR1)^KdUlp zV%DUr3$kjnW@a^HHD$GAwPlg4C0W;Jt;o6|>&C3RvUX(c&U!!VgRDbYpJsiYbvWxt z)^}OQvrXATwk2E1wq=K9M`TB4_skxgJv6&Cdt!D&_MGfx**9e0m;Ffg6WPyY@6O(r z{Z;nS>_2l1Ii?&b$C9JuB1a}MPk&N-6vUCs|VKjr+A^J~s;Imhj+-C#G_1-oRo+N10-_U`t4dk_10_Wt&P z_6mEYeUiP#KGi*((o;27>0>8Nrz9W{=rj_Hn>j=7Hcj)e}*vBYt?<2uKkj=LT0 zj`fZw9lITGINoyXbG+yH#_^luxZ|%}CYQ}M=2~*Ya);-R$Q_kCCbuNFG`BprGIv7m zl-!!!dASR67v*ZXi*ql_U6FfZ?k%~u=iZgOGWY)6t+|iqZqI!ocTesIxgX^o%Ka?& z%iP1cNAs9GoM*_hv zA-^fVIlnD`cK(w5%kozglowPMOe&aMP*vb8m{Q>Se>I)=R}+TgwcVwnb>cv@iVLL< zluWW0*$HGpLPGW+3qtnZizK*l;YM-QQMYZ?x~;R0)=?G3T@mYORm5-K^EvM?_xU64 zJ@)~q0JVU6fCXR&1OOpG3eX5x09XuI0$2)I4p<3T1y~DM57-9S4%i7e2sjM*8E_PE z7H}SL5pWss8{it?I^Y4I9q0vZk) z0~!aK0Gb4v0h$FW27y3OkP4&*X+Z{%5o7|HK^Bk~6aXy&Ed{LrHG@`z)`50_c7gVQ z_JaNHb&&WIg0L{S1`3&iXegz#29SY5Xj)P8s=0gjiGod9=I1~lNLJ3e3lm}HnozN@LYtZY^ zyU_d42heut6Xk{0r*|>kaD%8wSgPpOqZ1^)rQ4}Khe68;qa8U6*)3z3Z&h!~8>MNC9|hnR_&ivS`Z2n>RP*p1kW z*oQcPIEFZmIEgroIET1^xQw`hxQe)gxQA#%v?HD%o+JK2d_ayxPDg%+WFjk(0;Cuz zLn@IjqzCCoCXfxtG;$qs19B5`CvrD(FY*ZT4Dt%{D)JBHZRB0#6Vyyp5o!)HvBWdMJ7rIuAV#JszEp zo{TO)Pe;!{&qmKd7o$OFD7pkqM3d15voa@eF)9o`aX-<@h?h8E?Zo@gBS% zAHvVWFTgLxFU7CGufngzpTb|jU&Y_T-zN+ty0WyTbW`b;((T0I z#1X`i#L>ij;w0h}VgYeFaRzZVv4}XA2qPkhC?bZ4ClZMqB9AC1>WN08nP?+AiH*eh z#6`qr;%eer;y&U5;$h+m;wj=;;%~%j#GAxB#Cyc2#Mi`+#4h3&QZLdN(m2ut(nQh} z(kxOD2|+@UN=YOVg+wE4}wI@&`&UN?%Gp z${@;6N&&@32~dKR21=UJNSRMrNLfs2qAaI0Q&v;fQr1&8QZ`ZcQ1(%dQ_fQ^Qm#^N zP;OE>D4moylrBm)wFfnaI+B`8ok*QbEua=r=Td=G2z3p09d$jmh59{pCv`V<4|N~) zAoWM;Pt+sSGt_g`^VEyfE7WV$HtIuaC-npM(|_loy=nbuV`yV(<7v}qg|rzo3=Kys zr7>ycG!9Kf6VntlHBC!1(>%2AX}f5L-jqW?%gLjQ$+l75DMg?^WQpZ<{k7o#_0IAa836k`ly9HWpigE5Bz zV1OBL28w}Y&>4J&jA3Tj7!HP;;bWv28OB1!62>ydD#lvI2F7;AKE@Ho8O8_3N5*Gn z4`xqhA7(%1*UbLRVayTCLgozSY~~zhF%!hZF$qi(lgeZ;%b5bEnpwltGp)=3GsB$6 zT*zF)T*h3$Z?qTj{9%Y_o{>r?_yizu*Y)n~R+1RpiWfRKs%L>cBD+81v%1~w4 zGHMy4j9FG$R#m1c)0P>^>dMSzwz5ds!m`$~FXcVUdzELG4=f*4KBRnDc~1GL@-gM( z%Ey=ImrpJ)D4$jiEC-k4Sy`-X);Fxdtf8#otQ^)TRxWEIYYMA?Rmdu40a-{EhJ|Ml zStJ&PMPo5oWh^#}%c^FHSu&Q6Wnk5@>RE15rSP@o?6=yAGHL+H)*0MIRHnF~E z?PBd=?Pr}}U1dFHePs7$_ho0Xv)Loq#cVhm$;PnpY%aTkEnth-Dt0Z~#I~^Q?D_0P z>?Zay_DXgOyOq6{y`TLv`xyHK`!xF^`wIIS`*-$z_5=14_H*`2PA+E*XB=k&C!aH! zGnG@oDdH4!NE`}>&S7%OIUJ6ZBj>0%H5@&smgC?=IdM({XAx%|=LgPS&VJ4z&QF|k zob#OPoIg0XId?g2oadaEoKDUg&U~jx#zhzxwpA@xozBb?i21??tAVBUN2sM-bmhPULNmT zUOsO!Zw{}R2jZc4Bp!vwfZ#{1#Zxe4PZx`O%y?+ot>?;7tq z?=G*6*TL)Lz2Uv*ec*Lf^sg9IF{2_}5vzz-%&%BjvACkCVtGY##p;T66)hE;DmGVa ztJqPov*M?UBNY!SURAuV%&8n#IlgjoWkF?OC8`oriLazrGAmh?;!0`d{K}1$t(99V z_f+nyJXm?E@=WF1$}avO{z(3Kem;LHe>#5#e-Xclzm&h6znd&fs!rsCG!f%Abgd>Ebg)@b-g>!{4Awq}}a)dk~ zUnmp)*9;3yLYFWsj0zis8R2~4a$%dWUHC}&SoliVDSRV*EBq|%7JVi9S~NhEBN`77R?bAi$Ef%2rfd2$RdtNEBZxrQgljmNpwYYRdikShv>HGPtkqRL(wDA6VY?g zOHqgDljw8xgzA~qv#VLvRn?+uS+%lSQ|+zxSBI)o)tTz~)f=l@tG8C~soqz8u=-T> znd-OIUE)FFQQ})qh|}UF;-%u{;+5jn;&tK{@kVj0c$avOc%S&7_($;( z@pEB#0MQQ9T_BI_mVE6bAQ$VSR0$)?Jt%Vx-C%jU{}GOP?QBg!Z; zx~xpbmN{g8SyYymEtDOVU65UpU6x&u-Id*!waFgHUddj|-pc-weUx>{v*bDQk@8XU z(eivbPF^Nw$t&anxkxUPE97dqSssvwz z{!#u}(L<4=7^%orOjJx(OjW=X2nAX}R!|iT1y3PXNEHf&T5(BnMe&>Bn&MBzJw==1 zq2iI^sp5s=FGYvqAH@g7Cq=iir?QW7h;o>6ymFedP&r#UR|!;7lr$w%S*a8#g-Vms zth6cp%Ahi$%qZt67b}-4S130qw<~WcZ!7OA+msKKkCac8PnEBgZ&hEbvQ^)x2CIgu za#Z=MNvf%;>8cs3*(!*NpdzX$Dz-|gvZJytzk{hfN2dX5^P2CLC(x|*qGsjJlg z_4sP5+M#xtMewNkA@tI}$;TCHAd(7Lo9ZCD%ACbenp zB5jj)xwcumMSDL%+7bcH&Y4xvNqa5|cftECWgb=q~H7>U-#W>ig)w(r4+j z^#k?a=tt^v^|SOv`eHp$57w9HiF&f0rf2F|dak}&uhSd!b$X{hu3x5Kp>Ni&(XZF< z)bG|G*8i+Oraz%St-q|ls=uMXslTIts(+*JHe?w_8^##M8j1{11J+sft%j|J?S>tO-G(EEV}=uk(}r_~3x->UJBE9Pr-n|$XTuj`FJoV0 zmNDBn%9v{$Yn)=7Wh^oRjSwTu7&1nUF=O1AFs6)Y;}T<&agA}aajWrr<9_2I<6+|o z<7wkH;|=3Y;~nEY;{#)-vAcFyZB4Dd)=+D!b=10QJ+=PYP;I0(UfWQcu5GMcP`kKx zN$vXDmfAD5*K2>T{Z!Ydu3uet-8XeZ>Za5c)D_kh*8%Gwb%Z)%ovkiam#Ldyx4dp; z-Rin+b>G+Bs(VoPuI{s`pDD{U&@|XI%;YqAOkR`UlrS}z(xyh!0@GsCQqwZi3eyJD zCevoqHq#E%ZqpIdF;lzgwdqa$kow&Ey!r|Clj^6|!|DdgIm@q>^OozD8`nIN_LcV4_I36a`)>Ol`$K!D z{cpzz$G46Njwz05j_(|32i8GwFdStLwnO5OIbx2Lj#ZAejxCODjvbEuj-MT;9cLXE z9akLJ9Dh3QIUYD3IXWDjj@OQl&aa$bI|n)Qoa3BmC*8?(nw_VeXPoDp7o3-!SDe?J zH=MsaZ#r)||8(AWK5#yAK6Soub~rydKfC(72D%2jhPg(#M!WJ{(_DqFnXV#Nu?ysa zx~g4Dm(Er1a=13SesJw|?Q`vSop7CUopzmZU3dNNy5;)Qb>H>C)#3W&`t0gAcZhd{ceFRpTjZVV1$vQQv={5G@bbMv zuhOgbYQ1K!)$8(ly#a61yU@GRyUM%PyTQBNyTiN3yWe}rd)s^8+wOhredc}P?eKPb z-+147yL^3pU-|m`2KsV+dAKiW_5ll)YFrC;C|`(=KmU+XvcYyA$t%kTg1G9v0f;y>%Z z>A&Z1_doY{`rrFM`?~`@0=)zM0$G9Vz<|KOz@Wh3z|cTWU}Ru=fE(Bx*b>+l*b&$j z*d5p#I1o4(I2`yfa3pXna6E7-a5iv0a4B#na5wNG&=GhYcpLa9@Go zm=hco923kB76fTQR*)Zz1s4UE1e=0OgDt^L!PemB;J)C2;KAUb;OXGm;Q8RC;BUce z!TZ5y!S2w2(CE;ZP+n+kXnN?o5F~^O$wIo2HRKB=LW@Gpp&Oy!LpMWrLia*#q4v8(l;_RGCYzK84;NnnH-rC znHnjM03(nHEP{-nBjgA#QW@b#1QB(lCSr>$i>!-mh_pm@L=HqwMovdAM8`)bL?=e4 zL<^$RqTfYlMrTEfqI06fQD77tEr}wc=qN5)7G*`nQCUsWSdKx|+vHV!0*NT?IqL^!b^u{yCoaWU~I@jBTf z**DogIVd?iIW{>hIWq}OmL^F_QBsnWCsoOsq&``jtWR2#j-)#|Ke;H`lw6){POeF= zPi{TK$K>Qd^r)a_Jz z>SgLk4)#KzfI?-r>3W;XQTn?lC&f}FWsD8oo-EUO@E)>mEM#7 zDSb43JbfyCCVeG+EB!G2SNcQxQ)WbFbS5wJZ6-f6Ia81+%*@ObWr{PP3^W7JRAdAh zQAU!HXOtODMwc;WOc_hYo^fTonQ$hNY0Rw1tj+w8Ihy%3b0u>-b1(BW^E&e;)799w macJZ4#*vM=jbj_fH_mAUHNyTkUFy~Ae;kVVAOC+gBK{9c8pr(r literal 0 HcmV?d00001 diff --git a/frontend/gamma/html/exitPage_template.html b/frontend/gamma/html/exitPage_template.html new file mode 100644 index 0000000..7056320 --- /dev/null +++ b/frontend/gamma/html/exitPage_template.html @@ -0,0 +1,140 @@ + + + + + clipperz + + + + + + +
+ +
keep it to yourself!
+
+ + +
+
+
+
+
+

Goodbye! Thanks for using Clipperz.

+ +

You just logged out from your Clipperz account. We hope to see you again soon!

+
+
+ + +
+
+
+

下次再见!感谢您使用 Clipperz。

+ +

您仅仅是从您的 Clipperz 账户登出,我们希望很快再次见到您!

+
+
+ + + + + +
+
+
+

Arrivederci! Grazie per aver scelto Clipperz.

+ +

Sei uscito da Clipperz. Speriamo di rivederti presto.

+
+
+ + +
+
+
+

Clipperz をご利用いただきありがとうございました。

+ +

Clipperz から正常にログアウトしました。またのご利用をお待ちしています。

+
+
+
+ +
+
+
+
+

Até logo! Obrigado por utilizar Clipperz.

+ +

Você acaba de sair de sua conta Clipperz. Esperamos ve-lo de volta em breve!

+
+
+ + +
+
+
+

¡Hasta luego! Gracias por usar Clipperz

+ +

Se acaba cerrar su sesión Clipperz. ¡Esperamos verlo nuevamente pronto!

+
+
+ +
+
+
+

До свидания! Спасибо за использование Clipperz.

+ +

Вы только что вышли из своего аккаунта Clipperz. Мы надеемся увидеть Вас снова!

+
+
+ +
+
+
+

Auf Wiedersehen! Danke, dass Sie Clipperz verwendet haben.

+ +

Sie haben sich gerade von Ihrem Clipperz-Account abgemeldet. Wir hoffen, Sie bald wieder zu sehen.

+
+
+ +
+
+ + + diff --git a/frontend/gamma/html/index_template.html b/frontend/gamma/html/index_template.html new file mode 100644 index 0000000..8cf838c --- /dev/null +++ b/frontend/gamma/html/index_template.html @@ -0,0 +1,62 @@ + + + @page.title@ + + + +@css@ + + + + + + + + + +@js_DEBUG@ + + + +
+
+ + +
+
+
+
+
+ +
+

Attention!

+

If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.

+

Javascript is required to access Clipperz.

+
Please enable scripting or upgrade your browser.
+
+
+ +
+
+ + + + diff --git a/frontend/gamma/html/mobile_template.html b/frontend/gamma/html/mobile_template.html new file mode 100644 index 0000000..adc36e9 --- /dev/null +++ b/frontend/gamma/html/mobile_template.html @@ -0,0 +1,87 @@ + + + + + @page.title@ + +@copyright@ +@css@ + + + + + + + + + +@CLIPPERZ_DEBUG_VERSION@ + + + +
+
+ +
keep it to yourself!
+

loading ...

+
+ +@CLIPPERZ_INSTALLED_VERSION@ + +
+
+ + +
+
+
+
+
+ +
+

Attention!

+

If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.

+

Javascript is required to access Clipperz.

+
Please enable scripting or upgrade your browser.
+
+
+ +
+
+ + + + diff --git a/frontend/gamma/js/Bookmarklet.js b/frontend/gamma/js/Bookmarklet.js new file mode 100644 index 0000000..a8e3e69 --- /dev/null +++ b/frontend/gamma/js/Bookmarklet.js @@ -0,0 +1,801 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +clipperz_copiedContentToClipboard = false; + +//############################################################################# + +// Simple Set Clipboard System +// Author: Joseph Huckaby + +var ZeroClipboard = { + + version: "1.0.4", + clients: {}, // registered upload clients on page, indexed by id +// moviePath: 'ZeroClipboard.swf', // URL to movie +// moviePath: 'data:application/octet-stream;charset=utf-8;base64,Q1dTCYgGAAB4nH1V61LbRhTeXV2OJNsYczFgIEC4JCGABSRpSy+B2JDQQtWJocl0BqK1tUZqhOSRZAj/8ih9hz5AXsGZTl+ndHUhxU2nO56z3/l05uye7+wc6xr6DeUxqpcUhFCNXF9ffxjNcYhRo8U8NruO0IeRLTkm+BpEa4i8/+t3GRGUrRf5tktDe41dMC8Kpd14Q/DM911GPfHCd6zCLyzwa67Tafo0sAppuOWEHZdeyY1O4ERMbnajyPcKIYteUM+qdYPQD/It12m9jX2XBcSx5EYUON6ZwunOEXsXAY+O94HsAu8iFnjULe1mYN/je5u2WLnvAsnRNGrZ6rnfDZlxwQKxRV1XSd1ulPJ1/9KDBB13pDCiZ2ygEdsGj2WHvsXU3dc7taM3e/tHanjDZVqEV2HEzpUGa3V5dVd4Ocfz+5d1/5w6nnbgU4sF+17bFwPfjzT3k691aEDPGb92KBvNX1krmrOjqLNVrVLLb7K1ln9e3WlsVjd0/Um12XXcyPFy6ZHdyHHDkT5tt1JtF/rJerqn6Wu+F/ErsWCmPyiRjrYi54KlgZP/k2Tq9gPYSh5APZOYBVra2VicAtfyn+4qZwHt2E4rVJvszPH2HNcVD2lkS5eOxW3b9f1AtplzZkeKFdDLl/wkibodmyrUsmq241raYdye5ECpdrBf+2GQf0ncA4c3gJelHRrHjd03xs+7L9UMHh9lZN149aOSwuOfcnFO3qQmbb0V44aoSVEXlHeikXQzz1/bpzek8E50XN6o4r/KLfQpU/pMx/J/yz9cxmWhDOOyhMqD5SkJjQnKYnmpIlfuVe5XHlSWKw8rC6QoEayoWk7MFwaKg6Whx4AJEBGIBEQGQQFJBaKBlAMpD6QA0gCQIsglICNAxkGYAFIBMgkwDWQGhFkgc0DuApkHsqDmMZAVIKtA1oBUgejqOmc21E1uHwF5DOQJ4C+AfAnkKyBbQL4G8g2Qb4F8B+o2wA6QZ4DrIOyCsAfCcw0lUwR/ZvgiOP3IhwgWcDZIsCipIpJkPmskBBiBgpGiIqQJOJdYPqbiOaRiUcRIQ5hrIfT055ySiKYVzMLKkKmuDM8aAyInyW1yNCOF22Q5I8Xb5FhGSjLR8n/gnv5q+U+9t4/MojnYLtEhc3jljjGCGT4Z7bXL7bG9Udwefz9xjk9Vhl3crtjqqXwifS8hWzblJToZmylTbk+vYuMOjsECWjZnkuDZvTmcwbscGvOiKVcxXThZNGVjkQebS+17pmLcJwl8sI1v4PI2uYEPt4UbuLItxrCwoplgrMagaOZTENf2NK0NryE8gWRCVE3p6ae5j3aOFwyZb8of6RT3FYn7Y9yvmjlDx1mKGncSfVTC9Z/v6QyZE7q5rpsburmpm490U+K/12g6WXYc+nR4CKX/H31zGG1z5m9Pt5okCg==', +// moviePath: 'http://localhost:8000/tests/js/tests/Bookmarklet/ZeroClipboard.swf', + moviePath: 'http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/ZeroClipboard_1.0.4.swf', +// moviePath: './ZeroClipboard.swf', + nextId: 1, // ID of next movie + + $: function(thingy) { + // simple DOM lookup utility function + if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); + if (!thingy.addClass) { + // extend element with a few useful methods + thingy.hide = function() { this.style.display = 'none'; }; + thingy.show = function() { this.style.display = ''; }; + thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; + thingy.removeClass = function(name) { + this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, ''); + }; + thingy.hasClass = function(name) { + return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); + } + } + return thingy; + }, + + setMoviePath: function(path) { + // set path to ZeroClipboard.swf + this.moviePath = path; + }, + + dispatch: function(id, eventName, args) { + // receive event from flash movie, send to client + var client = this.clients[id]; + if (client) { + client.receiveEvent(eventName, args); + } + }, + + register: function(id, client) { + // register new client to receive events + this.clients[id] = client; + }, + + getDOMObjectPosition: function(obj) { + // get absolute coordinates for dom element + var info = { + left: 0, + top: 0, + width: obj.width ? obj.width : obj.offsetWidth, + height: obj.height ? obj.height : obj.offsetHeight + }; + + while (obj) { + info.left += obj.offsetLeft; + info.top += obj.offsetTop; + obj = obj.offsetParent; + } + + return info; + }, + + Client: function(elem) { + // constructor for new simple upload client + this.handlers = {}; + + // unique ID + this.id = ZeroClipboard.nextId++; + this.movieId = 'ZeroClipboardMovie_' + this.id; + + // register client with singleton to receive flash events + ZeroClipboard.register(this.id, this); + + // create movie + if (elem) this.glue(elem); + } +}; + +ZeroClipboard.Client.prototype = { + + id: 0, // unique ID for us + ready: false, // whether movie is ready to receive events or not + movie: null, // reference to movie object + clipText: '', // text to copy to clipboard + handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor + cssEffects: true, // enable CSS mouse effects on dom container + handlers: null, // user event handlers + + glue: function(elem) { + // glue to DOM element + // elem can be ID or actual DOM element object +//console.log(">>> glue"); + this.domElement = ZeroClipboard.$(elem); + + // float just above object, or zIndex 99 if dom element isn't set + var zIndex = 99; + if (this.domElement.style.zIndex) { + zIndex = parseInt(this.domElement.style.zIndex) + 1; + } + + // find X/Y position of domElement + var box = ZeroClipboard.getDOMObjectPosition(this.domElement); + + // create floating DIV above element + this.div = document.createElement('div'); + var style = this.div.style; + style.position = 'absolute'; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + style.width = '' + box.width + 'px'; + style.height = '' + box.height + 'px'; + style.zIndex = zIndex; + + // style.backgroundColor = '#f00'; // debug + + var body = document.getElementsByTagName('body')[0]; + body.appendChild(this.div); + + this.div.innerHTML = this.getHTML( box.width, box.height ); +//console.log("<<< glue"); + }, + + getHTML: function(width, height) { + // return HTML for movie + var html = ''; + var flashvars = 'id=' + this.id + + '&width=' + width + + '&height=' + height; + + if (navigator.userAgent.match(/MSIE/)) { + // IE gets an OBJECT tag + var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; + html += ''; + } + else { + // all other browsers get an EMBED tag + html += ''; + } + return html; + }, + + hide: function() { + // temporarily hide floater offscreen + if (this.div) { + this.div.style.left = '-2000px'; + } + }, + + show: function() { + // show ourselves after a call to hide() + this.reposition(); + }, + + destroy: function() { + // destroy control and floater + if (this.domElement && this.div) { + this.hide(); + this.div.innerHTML = ''; + + var body = document.getElementsByTagName('body')[0]; + try { body.removeChild( this.div ); } catch(e) {;} + + this.domElement = null; + this.div = null; + } + }, + + reposition: function(elem) { + // reposition our floating div, optionally to new container + // warning: container CANNOT change size, only position + if (elem) { + this.domElement = ZeroClipboard.$(elem); + if (!this.domElement) this.hide(); + } + + if (this.domElement && this.div) { + var box = ZeroClipboard.getDOMObjectPosition(this.domElement); + var style = this.div.style; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + } + }, + + setText: function(newText) { + // set text to be copied to clipboard + this.clipText = newText; + if (this.ready) this.movie.setText(newText); + }, + + addEventListener: function(eventName, func) { + // add user event listener for event + // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + if (!this.handlers[eventName]) this.handlers[eventName] = []; + this.handlers[eventName].push(func); + }, + + setHandCursor: function(enabled) { + // enable hand cursor (true), or default arrow cursor (false) + this.handCursorEnabled = enabled; + if (this.ready) this.movie.setHandCursor(enabled); + }, + + setCSSEffects: function(enabled) { + // enable or disable CSS effects on DOM container + this.cssEffects = !!enabled; + }, + + receiveEvent: function(eventName, args) { + // receive event from flash + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + + // special behavior for certain events + switch (eventName) { + case 'load': + // movie claims it is ready, but in IE this isn't always the case... + // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function + this.movie = document.getElementById(this.movieId); + if (!this.movie) { + var self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 1 ); + return; + } + + // firefox on pc needs a "kick" in order to set these in certain cases + if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { + var self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 100 ); + this.ready = true; + return; + } + + this.ready = true; + this.movie.setText( this.clipText ); + this.movie.setHandCursor( this.handCursorEnabled ); + break; + + case 'mouseover': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('hover'); + if (this.recoverActive) this.domElement.addClass('active'); + } + break; + + case 'mouseout': + if (this.domElement && this.cssEffects) { + this.recoverActive = false; + if (this.domElement.hasClass('active')) { + this.domElement.removeClass('active'); + this.recoverActive = true; + } + this.domElement.removeClass('hover'); + } + break; + + case 'mousedown': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('active'); + } + break; + + case 'mouseup': + if (this.domElement && this.cssEffects) { + this.domElement.removeClass('active'); + this.recoverActive = false; + } + break; + } // switch eventName + + if (this.handlers[eventName]) { + for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { + var func = this.handlers[eventName][idx]; + + if (typeof(func) == 'function') { + // actual function reference + func(this, args); + } + else if ((typeof(func) == 'object') && (func.length == 2)) { + // PHP style object + method, i.e. [myObject, 'myMethod'] + func[0][ func[1] ](this, args); + } + else if (typeof(func) == 'string') { + // name of function + window[func](this, args); + } + } // foreach event handler defined + } // user defined handler for event + } + +}; + +//############################################################################# + +var clip = null; + +function $(id) { return document.getElementById(id); } + +function initClip() { +//console.log(">>> initClip"); + clip = new ZeroClipboard.Client(); + clip.setHandCursor( true ); + +// clip.addEventListener('load', my_load); +// clip.addEventListener('mouseOver', my_mouse_over); + clip.addEventListener('complete', my_complete); + +// clip.glue( 'd_clip_button' ); +//console.log("<<< initClip"); +} + +//function my_load(client) { +// console.log("Flash movie loaded and ready."); +//} + +//function my_mouse_over(client) { +// // we can cheat a little here -- update the text on mouse over +// clip.setText( $('fe_text').value ); +//} + +function my_complete(client, text) { +// console.log("Copied text to clipboard: ... "); +// console.log("Copied text to clipboard: " + text ); + clipperz_copiedContentToClipboard = true; + showTooltip(); +} + +//function debugstr(msg) { +// var p = document.createElement('p'); +// p.innerHTML = msg; +// $('d_debug').appendChild(p); +//} + +//############################################################################# + +_cble = null; + +//----------------------------------------------------------------------------- + +isLoginForm = function(aForm) { + var inputFields; + var passwordFieldsFound; + var i,c; + +//console.log("is login form: " + aForm.name + " (" + aForm.id + ")"); + passwordFieldsFound = 0; + inputFields = aForm.elements; + c = inputFields.length; + for (i=0; i
+
+ +
keep it to yourself!
+

loading ...

+
+ +@js_INSTALL@ + +
'+html+'
'; + nodes = tempTableEl.firstChild.firstChild.childNodes; + }else{ + tempTableEl.innerHTML = ''+html+'
'; + 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 {Boolean} 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 {Boolean} 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 {Boolean} 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 {Boolean} 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 this blog post with examples. +*
+* This class is also available as Clipperz.YUI.Template. +* @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 {Boolean} 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 {Boolean} 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 {Boolean} returnElement (optional) true to return a YAHOO.Element + * @return {HTMLElement} The new node + */ + append : function(el, values, returnElement){ + var sanitizedValues; + var key; + +// sanitizedValues = MochiKit.Base.map(sanitizedValues) +//console.log("values", values); + sanitizedValues = {}; + for (key in values) { + sanitizedValues[key] = Clipperz.Base.sanitizeString(values[key]); + } +//console.log("sanitizedValues", sanitizedValues); +// el = el.dom ? el.dom : YAHOO.util.Dom.get(el); + el = (typeof el == 'string') ? YAHOO.util.Dom.get(el) : el; +//Clipperz.log(this.applyTemplate(sanitizedValues)); + var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(sanitizedValues)); +// return returnElement ? YAHOO.Element.get(newNode, true) : newNode; + 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 {Boolean} 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/gamma/js/Clipperz/YUI/DomQuery.js b/frontend/gamma/js/Clipperz/YUI/DomQuery.js new file mode 100644 index 0000000..4a143ab --- /dev/null +++ b/frontend/gamma/js/Clipperz/YUI/DomQuery.js @@ -0,0 +1,714 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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 c= where c 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/gamma/js/Clipperz/YUI/Utils.js b/frontend/gamma/js/Clipperz/YUI/Utils.js new file mode 100644 index 0000000..4d4a5f9 --- /dev/null +++ b/frontend/gamma/js/Clipperz/YUI/Utils.js @@ -0,0 +1,98 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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/gamma/js/JSON/json2.js b/frontend/gamma/js/JSON/json2.js new file mode 100644 index 0000000..b67e167 --- /dev/null +++ b/frontend/gamma/js/JSON/json2.js @@ -0,0 +1,481 @@ +/* + http://www.JSON.org/json2.js + 2008-09-01 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the object holding the key. + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be used to + select the members to be serialized. It filters the results such + that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. +*/ + +/*jslint evil: true */ + +/*global JSON */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", call, + charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, getUTCMinutes, + getUTCMonth, getUTCSeconds, hasOwnProperty, join, lastIndex, length, + parse, propertyIsEnumerable, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +if (!this.JSON) { + JSON = {}; +} +(function () { + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapeable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapeable.lastIndex = 0; + return escapeable.test(string) ? + '"' + string.replace(escapeable, function (a) { + var c = meta[a]; + if (typeof c === 'string') { + return c; + } + return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : + '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// If the object has a dontEnum length property, we'll treat it as an array. + + if (typeof value.length === 'number' && + !value.propertyIsEnumerable('length')) { + +// The object is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : + gap ? '[\n' + gap + + partial.join(',\n' + gap) + '\n' + + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : + gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + + mind + '}' : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/. +test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). +replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). +replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +})(); \ No newline at end of file diff --git a/frontend/gamma/js/MochiKit/Async.js b/frontend/gamma/js/MochiKit/Async.js new file mode 100644 index 0000000..c7408e7 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Async.js @@ -0,0 +1,640 @@ +/*** + +MochiKit.Async 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('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; +}; + +MochiKit.Async.Deferred.prototype = { + /** @id MochiKit.Async.Deferred.prototype.repr */ + repr: function () { + var state; + if (this.fired == -1) { + state = 'unfired'; + } else if (this.fired === 0) { + state = 'success'; + } else { + state = 'error'; + } + return 'Deferred(' + this.id + ', ' + state + ')'; + }, + + toString: MochiKit.Base.forwardCall("repr"), + + _nextId: MochiKit.Base.counter(), + + /** @id MochiKit.Async.Deferred.prototype.cancel */ + cancel: function () { + var self = MochiKit.Async; + if (this.fired == -1) { + if (this.canceller) { + this.canceller(this); + } else { + this.silentlyCancelled = true; + } + if (this.fired == -1) { + this.errback(new self.CancelledError(this)); + } + } else if ((this.fired === 0) && (this.results[0] instanceof self.Deferred)) { + this.results[0].cancel(); + } + }, + + _resback: function (res) { + /*** + + The primitive that means either callback or errback + + ***/ + this.fired = ((res instanceof Error) ? 1 : 0); + this.results[this.fired] = res; + 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"); + } + this.chain.push([cb, eb]); + 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._resback(res); + self.paused--; + if ((self.paused === 0) && (self.fired >= 0)) { + self._fire(); + } + }; + 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 (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 && 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 + */ + }, 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); + } + } + 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.wait */ + wait: function (seconds, /* optional */value) { + var d = new MochiKit.Async.Deferred(); + var m = MochiKit.Base; + if (typeof(value) != 'undefined') { + d.addCallback(function () { return value; }); + } + var timeout = setTimeout( + m.bind("callback", d), + 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._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/gamma/js/MochiKit/Base.js b/frontend/gamma/js/MochiKit/Base.js new file mode 100644 index 0000000..d33c269 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Base.js @@ -0,0 +1,1452 @@ +/*** + +MochiKit.Base 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(MochiKit) == 'undefined') { + MochiKit = {}; +} +if (typeof(MochiKit.__export__) == "undefined") { + MochiKit.__export__ = true; +} +if (typeof(MochiKit.Base) == 'undefined') { + MochiKit.Base = {}; +} + +/** + * Registers a new MochiKit module. This function will insert a new + * property into the "MochiKit" object, making sure that all + * dependency modules have already been inserted. It will also make + * sure that the appropriate properties and default module functions + * are defined. + * + * @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 (name, version, deps) { + if (!(name in MochiKit)) { + MochiKit[name] = {}; + } + var module = MochiKit[name]; + module.NAME = "MochiKit." + name; + module.VERSION = version; + module.__repr__ = function () { + return "[" + this.NAME + " " + this.VERSION + "]"; + }; + module.toString = function () { + return this.__repr__(); + }; + for (var i = 0; i < deps.length; i++) { + if (!(deps[i] in MochiKit)) { + throw 'MochiKit.' + name + ' depends on MochiKit.' + deps[i] + '!'; + } + } +} + +MochiKit.Base._module("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); + 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; + 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) { + if (typeof(o.NAME) == 'string' && ( + o.toString == Function.prototype.toString || + o.toString == Object.prototype.toString + )) { + return o.NAME; + } + } + 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 () { + return eval("(" + MochiKit.Base._filterJSON(arguments[0]) + ")"); + }, + + _filterJSON: function (s) { + var m = s.match(/^\s*\/\*(.*)\*\/\s*$/); + if (m) { + return m[1]; + } + return 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.__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(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; + } +}; + +MochiKit.Base._exportSymbols = function (globals, module) { + if (MochiKit.__export__ === false || module.__export__ === false) { + return; + } + for (var k in module) { + var v = module[k]; + if (v != null) { + var okName = (k[0] !== "_" && k !== "toString"); + if (v.__export__ === true || (v.__export__ !== false && okName)) { + globals[k] = module[k]; + } + } + } +}; + +/** + * 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 true + */ +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); + }; + if (exportable === false) { + func.__export__ = false; + } + 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', false); + m._deprecated(m, 'find', 'MochiKit.Base.findValue', '1.3', false); + + 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' + ).rval.replace(/\'/g, '%27'); + }; + } + + /** @id MochiKit.Base.NamedError */ + m.NamedError = function (name) { + this.message = name; + this.name = name; + }; + m.NamedError.prototype = new Error(); + 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.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/gamma/js/MochiKit/Color.js b/frontend/gamma/js/MochiKit/Color.js new file mode 100644 index 0000000..27dc2d0 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Color.js @@ -0,0 +1,832 @@ +/*** + +MochiKit.Color 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +MochiKit.Base._module('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().b > 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] + }; + + var makeColor = function (name, r, g, b, a) { + var rval = this.fromRGB(r, g, b, a); + this[name] = function () { return rval; }; + return rval; + }; + + for (var k in colors) { + var name = k + "Color"; + var bindArgs = m.concat( + [makeColor, this.Color, name], + colors[k] + ); + this.Color[name] = m.bind.apply(null, bindArgs); + } + + 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 + +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/gamma/js/MochiKit/DOM.js b/frontend/gamma/js/MochiKit/DOM.js new file mode 100644 index 0000000..af5d46f --- /dev/null +++ b/frontend/gamma/js/MochiKit/DOM.js @@ -0,0 +1,1144 @@ +/*** + +MochiKit.DOM 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('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; + if (typeof(node) == 'string') { + elem = self.getElement(node); + } + if (attrs) { + var updatetree = MochiKit.Base.updatetree; + 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 { + 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 (typeof(elem[k]) == "string" && elem[k] != v) { + // Also set property for weird attributes (see #302) + 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 { + 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 (typeof(elem[k]) == "string" && elem[k] != v) { + // Also set property for weird attributes (see #302) + 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, ">"); + }, + + /** @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(""); + 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", + "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'); + /** @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.UL */ + this.UL = createDOMFunc("ul"); + /** @id MochiKit.DOM.OL */ + this.OL = createDOMFunc("ol"); + /** @id MochiKit.DOM.LI */ + this.LI = createDOMFunc("li"); + /** @id MochiKit.DOM.DL */ + this.DL = createDOMFunc("dl"); + /** @id MochiKit.DOM.DT */ + this.DT = createDOMFunc("dt"); + /** @id MochiKit.DOM.DD */ + this.DD = createDOMFunc("dd"); + /** @id MochiKit.DOM.TD */ + this.TD = createDOMFunc("td"); + /** @id MochiKit.DOM.TR */ + this.TR = createDOMFunc("tr"); + /** @id MochiKit.DOM.TBODY */ + this.TBODY = createDOMFunc("tbody"); + /** @id MochiKit.DOM.THEAD */ + this.THEAD = createDOMFunc("thead"); + /** @id MochiKit.DOM.TFOOT */ + this.TFOOT = createDOMFunc("tfoot"); + /** @id MochiKit.DOM.TABLE */ + this.TABLE = createDOMFunc("table"); + /** @id MochiKit.DOM.TH */ + this.TH = createDOMFunc("th"); + /** @id MochiKit.DOM.INPUT */ + this.INPUT = createDOMFunc("input"); + /** @id MochiKit.DOM.SPAN */ + this.SPAN = createDOMFunc("span"); + /** @id MochiKit.DOM.A */ + this.A = createDOMFunc("a"); + /** @id MochiKit.DOM.DIV */ + this.DIV = createDOMFunc("div"); + /** @id MochiKit.DOM.IMG */ + this.IMG = createDOMFunc("img"); + /** @id MochiKit.DOM.BUTTON */ + this.BUTTON = createDOMFunc("button"); + /** @id MochiKit.DOM.TT */ + this.TT = createDOMFunc("tt"); + /** @id MochiKit.DOM.PRE */ + this.PRE = createDOMFunc("pre"); + /** @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.BR */ + this.BR = createDOMFunc("br"); + /** @id MochiKit.DOM.HR */ + this.HR = createDOMFunc("hr"); + /** @id MochiKit.DOM.LABEL */ + this.LABEL = createDOMFunc("label"); + /** @id MochiKit.DOM.TEXTAREA */ + this.TEXTAREA = createDOMFunc("textarea"); + /** @id MochiKit.DOM.FORM */ + this.FORM = createDOMFunc("form"); + /** @id MochiKit.DOM.P */ + this.P = createDOMFunc("p"); + /** @id MochiKit.DOM.SELECT */ + this.SELECT = createDOMFunc("select"); + /** @id MochiKit.DOM.OPTION */ + this.OPTION = createDOMFunc("option"); + /** @id MochiKit.DOM.OPTGROUP */ + this.OPTGROUP = createDOMFunc("optgroup"); + /** @id MochiKit.DOM.LEGEND */ + this.LEGEND = createDOMFunc("legend"); + /** @id MochiKit.DOM.FIELDSET */ + this.FIELDSET = createDOMFunc("fieldset"); + /** @id MochiKit.DOM.STRONG */ + this.STRONG = createDOMFunc("strong"); + /** @id MochiKit.DOM.CANVAS */ + this.CANVAS = createDOMFunc("canvas"); + + /** @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/gamma/js/MochiKit/DateTime.js b/frontend/gamma/js/MochiKit/DateTime.js new file mode 100644 index 0000000..c7b2d25 --- /dev/null +++ b/frontend/gamma/js/MochiKit/DateTime.js @@ -0,0 +1,173 @@ +/*** + +MochiKit.DateTime 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('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(iso[0], iso[1] - 1, iso[2]); + 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 hh = date.getHours(); + var mm = date.getMinutes(); + var ss = date.getSeconds(); + var lst = [ + ((realISO && (hh < 10)) ? "0" + hh : hh), + ((mm < 10) ? "0" + mm : mm), + ((ss < 10) ? "0" + ss : ss) + ]; + return lst.join(":"); +}; + +/** @id MochiKit.DateTime.toISOTimeStamp */ +MochiKit.DateTime.toISOTimestamp = function (date, realISO/* = false*/) { + if (typeof(date) == "undefined" || date === null) { + return null; + } + var sep = realISO ? "T" : " "; + var foot = realISO ? "Z" : ""; + if (realISO) { + date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000)); + } + return MochiKit.DateTime.toISODate(date) + sep + MochiKit.DateTime.toISOTime(date, realISO) + foot; +}; + +/** @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/gamma/js/MochiKit/DragAndDrop.js b/frontend/gamma/js/MochiKit/DragAndDrop.js new file mode 100644 index 0000000..62777c5 --- /dev/null +++ b/frontend/gamma/js/MochiKit/DragAndDrop.js @@ -0,0 +1,766 @@ +/*** +MochiKit.DragAndDrop 1.5 + +See 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('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 && (MochiKit.Base.repr(this._lastPointer.page) == + MochiKit.Base.repr(pointer.page))) { + 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'), + parseInt(s(this.element, 'top') || '0')]; + }, + + /** @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 = parseInt(MochiKit.Style.getStyle(this.element, + 'z-index') || '0'); + 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/gamma/js/MochiKit/Format.js b/frontend/gamma/js/MochiKit/Format.js new file mode 100644 index 0000000..122845e --- /dev/null +++ b/frontend/gamma/js/MochiKit/Format.js @@ -0,0 +1,309 @@ +/*** + +MochiKit.Format 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('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, + "(", + 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 = 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]) || 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/gamma/js/MochiKit/Iter.js b/frontend/gamma/js/MochiKit/Iter.js new file mode 100644 index 0000000..524b2bc --- /dev/null +++ b/frontend/gamma/js/MochiKit/Iter.js @@ -0,0 +1,790 @@ +/*** + +MochiKit.Iter 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('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 () { + var rval; + while (i < start) { + rval = seq.next(); + i++; + } + if (start >= stop) { + throw self.StopIteration; + } + 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 { + var result = argiter[0].next(); + return result; + } catch (e) { + if (e != self.StopIteration) { + throw e; + } + argiter.shift(); + var result = argiter[0].next(); + return result; + } + } + 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); + var 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/gamma/js/MochiKit/Logging.js b/frontend/gamma/js/MochiKit/Logging.js new file mode 100644 index 0000000..f00996b --- /dev/null +++ b/frontend/gamma/js/MochiKit/Logging.js @@ -0,0 +1,262 @@ +/*** + +MochiKit.Logging 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('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 = 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/gamma/js/MochiKit/LoggingPane.js b/frontend/gamma/js/MochiKit/LoggingPane.js new file mode 100644 index 0000000..c960c21 --- /dev/null +++ b/frontend/gamma/js/MochiKit/LoggingPane.js @@ -0,0 +1,327 @@ +/*** + +MochiKit.LoggingPane 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('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 */ +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( + '' + + '[MochiKit.LoggingPane]' + + '' + ); + 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 */ + 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) { 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; + 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/gamma/js/MochiKit/MochiKit.js b/frontend/gamma/js/MochiKit/MochiKit.js new file mode 100644 index 0000000..8e5be68 --- /dev/null +++ b/frontend/gamma/js/MochiKit/MochiKit.js @@ -0,0 +1,136 @@ +/*** + +MochiKit.MochiKit 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(MochiKit) == 'undefined') { + MochiKit = {}; +} + +if (typeof(MochiKit.MochiKit) == 'undefined') { + /** @id MochiKit.MochiKit */ + MochiKit.MochiKit = {}; +} + +MochiKit.MochiKit.NAME = "MochiKit.MochiKit"; +MochiKit.MochiKit.VERSION = "1.5"; +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">'); + } + }; +})(); diff --git a/frontend/gamma/js/MochiKit/MockDOM.js b/frontend/gamma/js/MochiKit/MockDOM.js new file mode 100644 index 0000000..abdb54a --- /dev/null +++ b/frontend/gamma/js/MochiKit/MockDOM.js @@ -0,0 +1,115 @@ +/*** + +MochiKit.MockDOM 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +if (typeof(MochiKit) == "undefined") { + MochiKit = {}; +} + +if (typeof(MochiKit.MockDOM) == "undefined") { + MochiKit.MockDOM = {}; +} + +MochiKit.MockDOM.NAME = "MochiKit.MockDOM"; +MochiKit.MockDOM.VERSION = "1.5"; + +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/gamma/js/MochiKit/Position.js b/frontend/gamma/js/MochiKit/Position.js new file mode 100644 index 0000000..6bc5b39 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Position.js @@ -0,0 +1,218 @@ +/*** + +MochiKit.Position 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005-2006 Bob Ippolito and others. All rights Reserved. + +***/ + +MochiKit.Base._module('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/gamma/js/MochiKit/Selector.js b/frontend/gamma/js/MochiKit/Selector.js new file mode 100644 index 0000000..6aec892 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Selector.js @@ -0,0 +1,387 @@ +/*** + +MochiKit.Selector 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +MochiKit.Base._module('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) || null; + b = parseInt(match[3]); + } + 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) { + 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/gamma/js/MochiKit/Signal.js b/frontend/gamma/js/MochiKit/Signal.js new file mode 100644 index 0000000..7df5619 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Signal.js @@ -0,0 +1,888 @@ +/*** + +MochiKit.Signal 1.5 + +See for documentation, downloads, license, etc. + +(c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('Signal', '1.5', ['Base', 'DOM', 'Style']); + +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('click') != -1 || + this.type() == 'contextmenu')) { + + m.client = new MochiKit.Style.Coordinates(0, 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 = new MochiKit.Style.Coordinates(0, 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 = new MochiKit.Style.Coordinates(0, 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; + }, + + _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) { + 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) { + 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 locked = 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 (locked) { + dirty = true; + } else { + observers.splice(i, 1); + } + } + } + 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 locked = 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 (!locked) { + 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 (!locked) { + 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 = true; + 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 = false; + if (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 = false; + 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/gamma/js/MochiKit/Sortable.js b/frontend/gamma/js/MochiKit/Sortable.js new file mode 100644 index 0000000..863b506 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Sortable.js @@ -0,0 +1,569 @@ +/*** +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('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/gamma/js/MochiKit/Style.js b/frontend/gamma/js/MochiKit/Style.js new file mode 100644 index 0000000..7f10117 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Style.js @@ -0,0 +1,558 @@ +/*** + +MochiKit.Style 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved. + +***/ + +MochiKit.Base._module('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 (!elem.parentNode && elem.x && elem.y) { + /* 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) || 0; + c.y += parseInt(parent.style.borderTopWidth) || 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'); + m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.3'); + + 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/gamma/js/MochiKit/Test.js b/frontend/gamma/js/MochiKit/Test.js new file mode 100644 index 0000000..9520ab2 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Test.js @@ -0,0 +1,144 @@ +/*** + +MochiKit.Test 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito. All rights Reserved. + +***/ + +MochiKit.Base._module('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/gamma/js/MochiKit/Text.js b/frontend/gamma/js/MochiKit/Text.js new file mode 100644 index 0000000..a44f7e4 --- /dev/null +++ b/frontend/gamma/js/MochiKit/Text.js @@ -0,0 +1,577 @@ +/*** + +MochiKit.Text 1.5 + +See for documentation, downloads, license, etc. + +(c) 2008 Per Cederberg. All rights Reserved. + +***/ + +MochiKit.Base._module('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, applies a function and joins the results + * back together again. This is a convenience function for calling + * split(), map() and join() separately. It can be used to easily + * trim each line in a text string (using the strip function), or to + * translate a text word-by-word. + * + * @param {Function} func the function to apply + * @param {String} str the string to split + * @param {String} [separator] the separator character to use, + * defaults to newline + * + * @return {String} a string with the joined up results + */ +MochiKit.Text.splitJoin = function (func, str, separator) { + if (str == null || str.length == 0) { + return str; + } + separator = separator || '\n' + return MochiKit.Base.map(func, str.split(separator)).join(separator); +} + +/** + * 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 (typeof(locale) == "undefined") { + 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 + */ +MochiKit.Text.formatValue = function (spec, value, locale) { + var self = MochiKit.Text; + if (typeof(spec) === "string") { + spec = self._parseFormatFlags(spec, 0, spec.length - 1); + } + for (var i = 0; spec.path != null && i < spec.path.length; i++) { + if (value != null) { + value = value[spec.path[i]]; + } + } + if (typeof(locale) == "undefined") { + locale = MochiKit.Format.formatLocale(); + } else if (typeof(locale) == "string") { + locale = MochiKit.Format.formatLocale(locale); + } + var str = ""; + if (spec.numeric) { + 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 = (spec.sign === "-") ? "" : spec.sign; + sign = (value < 0) ? "-" : 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.grouping); + 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) ? "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} grouping the grouping flag + * + * @return {String} the localized number string + */ +MochiKit.Text._localizeNumber = function (num, locale, grouping) { + var parts = num.split(/\./); + var whole = parts[0]; + var frac = (parts.length == 1) ? "" : parts[1]; + var res = (frac.length > 0) ? locale.decimal : ""; + while (grouping && 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 += frac; + } + while (grouping && 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 start = 0; + var pos = 0; + for (pos = 0; pos < pattern.length; pos++) { + if (pattern.charAt(pos) == "{") { + if (pos + 1 >= pattern.length) { + var msg = "unescaped { char, should be escaped as {{"; + throw new self.FormatPatternError(pattern, pos, msg); + } else if (pattern.charAt(pos + 1) == "{") { + parts.push(pattern.substring(start, pos + 1)); + start = pos + 2; + pos++; + } else { + if (start < pos) { + parts.push(pattern.substring(start, pos)); + } + start = pattern.indexOf("}", pos) + 1; + if (start <= 0) { + var msg = "unmatched { char, not followed by a } char"; + throw new self.FormatPatternError(pattern, pos, msg); + } + parts.push(self._parseFormat(pattern, pos + 1, start - 1)); + pos = start - 1; + } + } else if (pattern.charAt(pos) == "}") { + if (pos + 1 >= pattern.length || pattern.charAt(pos + 1) != "}") { + var msg = "unescaped } char, should be escaped as }}"; + throw new self.FormatPatternError(pattern, pos, msg); + } + parts.push(pattern.substring(start, pos + 1)); + start = pos + 2; + pos++; + } + } + if (start < pos) { + parts.push(pattern.substring(start, pos)); + } + 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 info; + var pos = text.indexOf(":"); + if (pos == 0) { + info = self._parseFormatFlags(pattern, startPos + 1, endPos); + info.path = [0]; + } else if (pos > 0) { + info = self._parseFormatFlags(pattern, startPos + pos + 1, endPos); + info.path = text.substring(0, pos).split("."); + } else { + info = self._parseFormatFlags(pattern, endPos, endPos); + info.path = text.split("."); + } + var DIGITS = /^\d+$/; + for (var i = 0; i < info.path.length; i++) { + var e = info.path[i]; + if (typeof(e) == "string") { + // TODO: replace with MochiKit.Format.strip? + e = e.replace(/^\s+/, "").replace(/\s+$/, ""); + if (e == "" && info.path.length == 1) { + e = 0; + } else if (e == "") { + var msg = "format value path contains blanks"; + throw new self.FormatPatternError(pattern, startPos, msg); + } else if (DIGITS.test(e)) { + e = parseInt(e); + } + } + info.path[i] = e; + } + 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 self = MochiKit.Text; + var info = { numeric: false, format: "s", width: 0, precision: -1, + align: ">", sign: "-", padding: " ", grouping: false }; + // TODO: replace with MochiKit.Format.rstrip? + var flags = pattern.substring(startPos, endPos).replace(/\s+$/, ""); + while (flags.length > 0) { + switch (flags.charAt(0)) { + case ">": + case "<": + info.align = flags.charAt(0); + flags = flags.substring(1); + break; + case "+": + case "-": + case " ": + info.sign = flags.charAt(0); + flags = flags.substring(1); + break; + case ",": + info.grouping = true; + flags = flags.substring(1); + break; + case ".": + var chars = /^\d*/.exec(flags.substring(1))[0]; + info.precision = parseInt(chars); + flags = flags.substring(1 + chars.length); + break; + case "0": + info.padding = flags.charAt(0); + flags = flags.substring(1); + break; + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + var chars = /^\d*/.exec(flags)[0]; + info.width = parseInt(chars); + flags = flags.substring(chars.length); + break; + case "s": + case "r": + info.format = flags.charAt(0); + flags = flags.substring(1); + break; + case "b": + case "d": + case "o": + case "x": + case "X": + case "f": + case "%": + info.numeric = true; + info.format = flags.charAt(0); + info.radix = 10; + if (info.format === "b") { + info.radix = 2; + } else if (info.format === "o") { + info.radix = 8; + } else if (info.format === "x" || info.format === "X") { + info.radix = 16; + } + flags = flags.substring(1); + break; + default: + var msg = "unsupported format flag: " + flags.charAt(0); + throw new self.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 the same helper function + // as roundToFixed now does. + var str; + if (precision >= 0) { + str = MochiKit.Format.roundToFixed(value, precision + 2); + } else { + str = (value == null) ? "0" : value.toString(); + } + var fracPos = str.indexOf("."); + if (fracPos < 0) { + str = str + "00"; + } else if (fracPos + 3 >= str.length) { + var fraction = str.substring(fracPos + 1); + while (fraction.length < 2) { + fraction = fraction + "0"; + } + str = str.substring(0, fracPos) + fraction; + } else { + var fraction = str.substring(fracPos + 1); + str = str.substring(0, fracPos) + fraction.substring(0, 2) + + "." + fraction.substring(2); + } + while (str.length > 1 && str.charAt(0) == "0" && str.charAt(1) != ".") { + str = str.substring(1); + } + return str; +} + +/** + * 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"); + + +// +//XXX: Internet Explorer exception handling blows +// +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/gamma/js/MochiKit/Visual.js b/frontend/gamma/js/MochiKit/Visual.js new file mode 100644 index 0000000..648d82a --- /dev/null +++ b/frontend/gamma/js/MochiKit/Visual.js @@ -0,0 +1,1975 @@ +/*** + +MochiKit.Visual 1.5 + +See for documentation, downloads, license, etc. + +(c) 2005 Bob Ippolito and others. All rights Reserved. + +***/ + +MochiKit.Base._module('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 = "
" + el.innerHTML + "
"; + }, + + _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.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; + } + + 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') { + if (this.options.transition) { + pos = this.options.transition(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.w, + originalWidth: elementDimensions.h}, + 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); +}; + + +/* end of Rico adaptation */ + +MochiKit.Visual.__new__ = function () { + var m = MochiKit.Base; + + // Backwards compatibility aliases + m._deprecated(this, 'Color', 'MochiKit.Color.Color', '1.1'); + m._deprecated(this, 'getElementsComputedStyle', 'MochiKit.Style.getStyle', '1.1'); + + m.nameFunctions(this); +}; + +MochiKit.Visual.__new__(); + +MochiKit.Base._exportSymbols(this, MochiKit.Visual); diff --git a/frontend/gamma/js/MochiKit/__package__.js b/frontend/gamma/js/MochiKit/__package__.js new file mode 100644 index 0000000..8d644b1 --- /dev/null +++ b/frontend/gamma/js/MochiKit/__package__.js @@ -0,0 +1,18 @@ +dojo.kwCompoundRequire({ + "common": [ + "MochiKit.Base", + "MochiKit.Iter", + "MochiKit.Logging", + "MochiKit.DateTime", + "MochiKit.Format", + "MochiKit.Async", + "MochiKit.DOM", + "MochiKit.Style", + "MochiKit.LoggingPane", + "MochiKit.Color", + "MochiKit.Signal", + "MochiKit.Position", + "MochiKit.Visual" + ] +}); +dojo.provide("MochiKit.*"); diff --git a/frontend/gamma/js/main.js b/frontend/gamma/js/main.js new file mode 100644 index 0000000..abb178f --- /dev/null +++ b/frontend/gamma/js/main.js @@ -0,0 +1,109 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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 shouldShowRegistrationForm; + var useCompactDesign; + var controllerParameters; +// var iPhoneDesign; + +// MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent); +// MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent); +// MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent); + + controllerParameters = {}; + + MochiKit.DOM.removeElement('javaScriptAlert'); + Clipperz.PM.Strings.Languages.initSetup(); + + if (window.location.search.indexOf('registration') != -1) { + shouldShowRegistrationForm = true; + } else { + shouldShowRegistrationForm = false; + } + + if (window.location.search.indexOf('autocomplete') != -1) { + controllerParameters['autocomplete'] = 'on' + } + +// if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) { +// iPhoneDesign = true; +// } else { +// iPhoneDesign = false; +// } + + if (window.location.search.indexOf('compact') != -1) { + useCompactDesign = true; + } else { + useCompactDesign = false; + } + + if (useCompactDesign == true) { + Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters); +// } else if (iPhoneDesign == true) { +// Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController(); + } else { + Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters); + } + + Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm); + +//Clipperz.log("HASH: " + window.location.hash); +if (window.location.hash != "") { + window.location.hash = "" +} +//Clipperz.log("HASH cleaned"); +// #credentials=base64encoded({username:'joe', passphrase:'clipperz'}) +// MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); +} + +MochiKit.DOM.addLoadEvent(run); diff --git a/frontend/gamma/js/main_iPhone.js b/frontend/gamma/js/main_iPhone.js new file mode 100644 index 0000000..f13e95c --- /dev/null +++ b/frontend/gamma/js/main_iPhone.js @@ -0,0 +1,60 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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); + result = new MochiKit.Async.CancelledError(anError); + } + + return result; +} + + +Clipperz.PM.RunTime = {}; + + +function run() { + MochiKit.DOM.removeElement('javaScriptAlert'); + Clipperz.PM.Strings.Languages.initSetup(); + + Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController(); + Clipperz.PM.RunTime.mainController.run(false); +} + +MochiKit.DOM.addLoadEvent(run); diff --git a/frontend/gamma/properties/creditsAndCopyrights.txt b/frontend/gamma/properties/creditsAndCopyrights.txt new file mode 100644 index 0000000..598440d --- /dev/null +++ b/frontend/gamma/properties/creditsAndCopyrights.txt @@ -0,0 +1,336 @@ +@clipperz.license@ + +=============================================================================== + + This application is build using also the following libraries + +# MochiKit (http://www.mochikit.com) + - repository: @mochikit.repository@ (revision: @mochikit.version@) + + * Software licence: http://svn.mochikit.com/mochikit/trunk/licence.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. + | + | 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. + + +# 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. + + + +# iUI: iPhone User Interface Framework (http://code.google.com/p/iui/) + - package version: 282 + + Copyright (c) 2007-2009, iUI Project Members + + | 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 of the iUI Project 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. + + + +# JSON library + - code downloaded on October 13, 2008 from http://www.JSON.org/json2.js + + | http://www.JSON.org/json2.js + | 2008-09-01 + | + | Public Domain. + | + | NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + | + | See http://www.JSON.org/js.html + + + +# 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/gamma/properties/gamma.properties.json b/frontend/gamma/properties/gamma.properties.json new file mode 100644 index 0000000..57f26f1 --- /dev/null +++ b/frontend/gamma/properties/gamma.properties.json @@ -0,0 +1,189 @@ +{ + "copyright.values": { + "mochikit.repository": "http://svn.mochikit.com/mochikit/trunk/", + "mochikit.version": "1506" + }, + "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", + + "JSON/json2.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/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/Connection.js", + "Clipperz/PM/Crypto.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/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/Canvas/Marks/exclamationMark.js", + "Clipperz/PM/UI/Canvas/Marks/questionMark.js", + "Clipperz/PM/UI/Canvas/Marks/info.js", + + "Clipperz/PM/UI/Canvas/Features/store.js", + "Clipperz/PM/UI/Canvas/Features/protect.js", + "Clipperz/PM/UI/Canvas/Features/directLogin.js", + "Clipperz/PM/UI/Canvas/Features/share.js", + + "Clipperz/PM/UI/Canvas/Star/normal.js", + + "Clipperz/PM/UI/Canvas/CoverActions/look.js", + "Clipperz/PM/UI/Canvas/CoverActions/download.js", + + "Clipperz/PM/UI/Canvas/Tips/open.js", + "Clipperz/PM/UI/Canvas/Tips/close.js", + + "Clipperz/PM/UI/Canvas/RegisterButton/normal.js", + + "Clipperz/PM/UI/Canvas/Logo/normal.js", + + "Clipperz/PM/UI/Canvas/GraphicFunctions.js", + + "Clipperz/PM/UI/Common/Components/BaseComponent.js", + "Clipperz/PM/UI/Common/Components/Button.js", + "Clipperz/PM/UI/Common/Components/ComponentSlot.js", + "Clipperz/PM/UI/Common/Components/FaviconComponent.js", + "Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js", + "Clipperz/PM/UI/Common/Components/ProgressBar.js", + "Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js", + "Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js", + "Clipperz/PM/UI/Common/Components/TabPanelComponent.js", + "Clipperz/PM/UI/Common/Components/Tooltip.js", + "Clipperz/PM/UI/Common/Components/TranslatorWidget.js", + + "Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js", + "Clipperz/PM/UI/Common/Controllers/ProgressBarController.js", + "Clipperz/PM/UI/Common/Controllers/TabPanelController.js", + "Clipperz/PM/UI/Common/Controllers/WizardController.js", + + "Clipperz/PM/UI/Web/Components/Page.js", + "Clipperz/PM/UI/Web/Components/PageHeader.js", + "Clipperz/PM/UI/Web/Components/PageFooter.js", + "Clipperz/PM/UI/Web/Components/LoginPage.js", + "Clipperz/PM/UI/Web/Components/LoginForm.js", + "Clipperz/PM/UI/Web/Components/LoginProgress.js", + "Clipperz/PM/UI/Web/Components/AppPage.js", + "Clipperz/PM/UI/Web/Components/UserInfoBox.js", + "Clipperz/PM/UI/Web/Components/TabSidePanel.js", + "Clipperz/PM/UI/Web/Components/GridComponent.js", + + "Clipperz/PM/UI/Web/Components/ColumnManager.js", + "Clipperz/PM/UI/Web/Components/TextColumnManager.js", + "Clipperz/PM/UI/Web/Components/FaviconColumnManager.js", + "Clipperz/PM/UI/Web/Components/ImageColumnManager.js", + "Clipperz/PM/UI/Web/Components/DateColumnManager.js", + "Clipperz/PM/UI/Web/Components/LinkColumnManager.js", + "Clipperz/PM/UI/Web/Components/DirectLoginColumnManager.js", + "Clipperz/PM/UI/Web/Components/DirectLoginsColumnManager.js", + "Clipperz/PM/UI/Web/Components/DeleteObjectColumnManager.js", + "Clipperz/PM/UI/Web/Components/CreateNewCardSplashComponent.js", + + "Clipperz/PM/UI/Web/Components/AccountPanel.js", + "Clipperz/PM/UI/Web/Components/DataPanel.js", + "Clipperz/PM/UI/Web/Components/ToolsPanel.js", + "Clipperz/PM/UI/Web/Components/RulerComponent.js", + "Clipperz/PM/UI/Web/Components/CardDialogComponent.js", + "Clipperz/PM/UI/Web/Components/CardDialogRecordFieldComponent.js", + "Clipperz/PM/UI/Web/Components/CardDialogRecordDirectLoginComponent.js", + "Clipperz/PM/UI/Web/Components/DirectLoginEditingComponent.js", + "Clipperz/PM/UI/Web/Components/DirectLoginEditingBindingComponent.js", + "Clipperz/PM/UI/Web/Components/DirectLoginEditingFormValueComponent.js", + "Clipperz/PM/UI/Web/Components/BookmarkletComponent.js", + "Clipperz/PM/UI/Web/Components/UnlockPasswordComponent.js", + "Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js", + "Clipperz/PM/UI/Web/Components/PasswordTooltip.js", + + "Clipperz/PM/UI/Web/Controllers/MainController.js", + "Clipperz/PM/UI/Web/Controllers/LoginController.js", + "Clipperz/PM/UI/Web/Controllers/AppController.js", + "Clipperz/PM/UI/Web/Controllers/FilterController.js", + "Clipperz/PM/UI/Web/Controllers/GridController.js", + "Clipperz/PM/UI/Web/Controllers/CardsController.js", + "Clipperz/PM/UI/Web/Controllers/DirectLoginsController.js", + "Clipperz/PM/UI/Web/Controllers/CardDialogController.js", + "Clipperz/PM/UI/Web/Controllers/DirectLoginWizardController.js", + "Clipperz/PM/UI/Web/Controllers/NewUserWizardController.js", + + "main.js" + ], + + "css": [ + "clipperz/clipperz.css", + "clipperz/compact.css" + ] +} \ No newline at end of file diff --git a/frontend/gamma/properties/mobile.properties.json b/frontend/gamma/properties/mobile.properties.json new file mode 100644 index 0000000..e26b95f --- /dev/null +++ b/frontend/gamma/properties/mobile.properties.json @@ -0,0 +1,119 @@ +{ + "copyright.values": { + "mochikit.repository": "http://svn.mochikit.com/mochikit/trunk/", + "mochikit.version": "1506" + }, + "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", + + "JSON/json2.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/KeyValueObjectStore.js", + + "Clipperz/Crypto/SHA.js", + "Clipperz/Crypto/AES.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/Connection.js", + "Clipperz/PM/Crypto.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/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/Common/Components/BaseComponent.js", + "-- Clipperz/PM/UI/Common/Components/Button.js", + "Clipperz/PM/UI/Common/Components/ComponentSlot.js", + "-- Clipperz/PM/UI/Common/Components/PasswordEntropyDisplay.js", + "Clipperz/PM/UI/Common/Components/ProgressBar.js", + "-- Clipperz/PM/UI/Common/Components/SimpleMessagePanel.js", + "-- Clipperz/PM/UI/Common/Components/MessagePanelWithProgressBar.js", + "-- Clipperz/PM/UI/Common/Components/TabPanelComponent.js", + "-- Clipperz/PM/UI/Common/Components/Tooltip.js", + "-- Clipperz/PM/UI/Common/Components/TranslatorWidget.js", + + "Clipperz/PM/UI/Common/Controllers/DirectLoginRunner.js", + "Clipperz/PM/UI/Common/Controllers/ProgressBarController.js", + "-- Clipperz/PM/UI/Common/Controllers/TabPanelController.js", + + "Clipperz/PM/UI/iPhone/Components/LoginForm.js", + "Clipperz/PM/UI/iPhone/Components/CardList.js", + "Clipperz/PM/UI/iPhone/Components/CardDetail.js", + + "Clipperz/PM/UI/iPhone/Controllers/MainController.js", + + "main_iPhone.js" + ], + + "css": [ + "clipperz/iPhone.css" + ] +} \ No newline at end of file diff --git a/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js b/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js new file mode 100644 index 0000000..040cdbf --- /dev/null +++ b/frontend/gamma/tests/SimpleTest/SimpleTest.Async.js @@ -0,0 +1,169 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +MochiKit.Base.update(Clipperz.Async.Deferred.prototype, { +/* + '_addTest': function(anExpectedValue, aDescription, isDeep, aResult) { + if (isDeep) { + SimpleTest.isDeeply(aResult, anExpectedValue, aDescription); + } else { + SimpleTest.is(aResult, anExpectedValue, aDescription); + } + + return aResult; + }, +*/ + 'addTest': function (anExpectedValue, aDescription, isDeep) { +// this.addMethod(this, '_addTest', anExpectedValue, aDescription, isDeep); +// this.addCallback(Clipperz.Async.test, anExpectedValue, aDescription, isDeep); + + if (isDeep) { +// SimpleTest.isDeeply(aResult, anExpectedValue, aDescription); + this.addCallback(Clipperz.Async.Test.isDeeply(anExpectedValue, aDescription)); + } else { +// SimpleTest.is(aResult, anExpectedValue, aDescription); + this.addCallback(Clipperz.Async.Test.is(anExpectedValue, aDescription)); + } + }, + + //------------------------------------------------------------------------- + + 'shouldSucceed': function (aDescription) { + this.addCallbackPass(SimpleTest.ok, true, aDescription); + this.addErrbackPass (SimpleTest.ok, false, aDescription); + this.addBoth(MochiKit.Async.succeed, null); + }, + + 'shouldFail': function (aDescription) { + this.addCallbackPass(SimpleTest.ok, false, aDescription); + this.addErrbackPass (SimpleTest.ok, true, aDescription); + this.addBoth(MochiKit.Async.succeed, null); + }, + + //------------------------------------------------------------------------- + +}); + + +Clipperz.Async.Test = {}; +MochiKit.Base.update(Clipperz.Async.Test, { + + 'is': function (anExpectedResult, aDescription) { + return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) { + SimpleTest.is(aResult, anExpectedResult, aDescription); + + return aResult; + }, anExpectedResult, aDescription); + }, + + //------------------------------------------------------------------------- + + 'ok': function (aDescription) { + return MochiKit.Base.partial(function (aDescription, aResult) { + SimpleTest.ok(aResult, aDescription); + + return aResult; + }, aDescription); + }, + + //------------------------------------------------------------------------- + + 'fail': function(aDescription) { + return MochiKit.Base.partial(function (aDescription, aResult) { + SimpleTest.ok(!aResult, aDescription); + + return aResult; + }, aDescription); + }, + + //------------------------------------------------------------------------- + + 'isDeeply': function (anExpectedResult, aDescription) { + return MochiKit.Base.partial(function (anExpectedResult, aDescription, aResult) { + SimpleTest.isDeeply(aResult, anExpectedResult, aDescription); + + return aResult; + }, anExpectedResult, aDescription); + }, + + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +}); + + +SimpleTest.runDeferredTests = function (aName, aTestSet, aTestArguments) { + try { + var deferredTests; + var aTestName; + var title; + + deferredTests = new Clipperz.Async.Deferred(aName + " ", aTestArguments); + + title = aName; + + aTestName = window.location.href.match(/#.*/); + if (aTestName && (aTestName != '#')) { + aTestName = aTestName[0].slice(1); + if (aTestName in aTestSet) { + //Clipperz.log("single test execution, via fragment identifier", aTestName); + title += ' [' + aTestName + ']'; + deferredTests.addCallback(aTestSet[aTestName], aTestArguments); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } else { + title = 'WRONG TEST NAME' + deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); + } + } else { + for (aTestName in aTestSet) { + deferredTests.addCallback(aTestSet[aTestName], aTestArguments); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + deferredTests.addBoth(MochiKit.Async.wait, 0.5); + } + deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); + } + + MochiKit.DOM.currentDocument().title = title; + + deferredTests.addBoth(SimpleTest.finish); + deferredTests.callback(); + + SimpleTest.waitForExplicitFinish(); + } catch (err) { + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); + } +} diff --git a/frontend/gamma/tests/SimpleTest/SimpleTest.js b/frontend/gamma/tests/SimpleTest/SimpleTest.js new file mode 100644 index 0000000..418954f --- /dev/null +++ b/frontend/gamma/tests/SimpleTest/SimpleTest.js @@ -0,0 +1,424 @@ +/** + * SimpleTest, a partial Test.Simple/Test.More API compatible test library. + * + * Why? + * + * Test.Simple doesn't work on IE < 6. + * TODO: + * * Support the Test.Simple API used by MochiKit, to be able to test MochiKit + * itself against IE 5.5 + * +**/ + +if (typeof(SimpleTest) == "undefined") { + var SimpleTest = {}; +} + +// Check to see if the TestRunner is present and has logging +if (typeof(parent) != "undefined" && parent.TestRunner) { + SimpleTest._logEnabled = parent.TestRunner.logEnabled; +} + +SimpleTest._tests = []; +SimpleTest._stopOnLoad = true; +SimpleTest._scopeCopy = {}; + +/** + * Saves a copy of the specified scope variables. + */ +SimpleTest.saveScope = function (scope) { + SimpleTest._scopeCopy = {}; + for (var k in scope) { + SimpleTest._scopeCopy[k] = scope[k]; + } +} + +/** + * Verifies the specified scope against the stored copy and reports + * any differences as test failures. + */ +SimpleTest.verifyScope = function (scope) { + var filter = ['test', '_firebug','_FirebugConsole','XMLHttpRequest','Audio', + 'XSLTProcessor','Option','Image','scrollMaxX','scrollMaxY', + 'clipboardData']; + for (var k in scope) { + if (MochiKit.Base.findValue(filter, k) < 0) { + var v = scope[k]; + var old = SimpleTest._scopeCopy[k]; + if (v !== old && typeof(old) === "undefined") { + SimpleTest.ok(false, "scope modified, variable " + k + " was added"); + } else if (v !== old) { + SimpleTest.ok(false, "scope modified, variable " + k + " changed from: " + old + ", to: " + v); + } + } + } + for (var k in SimpleTest._scopeCopy) { + if (!(k in scope)) { + SimpleTest.ok(false, "scope modified, variable " + k + " has been removed"); + } + } +} + +/** + * Something like assert. + */ +SimpleTest.ok = function (condition, name, diag) { + var test = {'result': !!condition, 'name': name, 'diag': diag || ""}; + if (SimpleTest._logEnabled) { + var msg = test.result ? "PASS" : "FAIL"; + msg += " | " + test.name; + if (test.result) { + parent.TestRunner.logger.log(msg); + } else { + msg += " | " + test.diag; + parent.TestRunner.logger.error(msg); + } + } + SimpleTest._tests.push(test); +}; + +/** + * Roughly equivalent to ok(a==b, name) + */ +SimpleTest.is = function (a, b, name) { + var repr = MochiKit.Base.repr; + SimpleTest.ok(a == b, name, "got " + repr(a) + ", expected " + repr(b)); +}; + +/** + * Roughly equivalent to ok(compare(a,b)==0, name) + */ +SimpleTest.eq = function (a, b, name) { + var base = MochiKit.Base; + var repr = base.repr; + try { + SimpleTest.ok(base.compare(a, b) == 0, name, "got " + repr(a) + ", expected " + repr(b)); + } catch (e) { + SimpleTest.ok(false, name, "exception in compare: " + repr(e)); + } +}; + + +/** + * Makes a test report, returns it as a DIV element. +**/ +SimpleTest.report = function () { + var DIV = MochiKit.DOM.DIV; + var passed = 0; + var failed = 0; + var results = MochiKit.Base.map( + function (test) { + var cls, msg; + if (test.result) { + passed++; + cls = "test_ok"; + msg = "ok - " + test.name; + } else { + failed++; + cls = "test_not_ok"; + msg = "not ok - " + test.name; + if (test.diag != null && test.diag != "") { + msg += ": " + test.diag; + } + } + return DIV({"class": cls}, msg); + }, + SimpleTest._tests + ); + var summary_class = ((failed == 0) ? 'all_pass' : 'some_fail'); + return DIV({'class': 'tests_report'}, + DIV({'class': 'tests_summary ' + summary_class}, + DIV({'class': 'tests_passed'}, "Passed: " + passed), + DIV({'class': 'tests_failed'}, "Failed: " + failed)), + results + ); +}; + +/** + * Toggle element visibility +**/ +SimpleTest.toggle = function(el) { + if (MochiKit.Style.getStyle(el, 'display') == 'block') { + el.style.display = 'none'; + } else { + el.style.display = 'block'; + } +}; + +/** + * Toggle visibility for divs with a specific class. +**/ +SimpleTest.toggleByClass = function (cls) { + var elems = MochiKit.DOM.getElementsByTagAndClassName('div', cls); + MochiKit.Base.map(SimpleTest.toggle, elems); + return false; +}; + +/** + * Shows the report in the browser +**/ + +SimpleTest.showReport = function() { + var base = MochiKit.Base; + var dom = MochiKit.DOM; + var togglePassed = dom.A({'href': '#'}, "Toggle passed tests"); + var toggleFailed = dom.A({'href': '#'}, "Toggle failed tests"); + togglePassed.onclick = base.partial(SimpleTest.toggleByClass, 'test_ok'); + toggleFailed.onclick = base.partial(SimpleTest.toggleByClass, 'test_not_ok'); + var body = document.getElementsByTagName("body")[0]; + var firstChild = body.childNodes[0]; + var addNode; + if (firstChild) { + addNode = function (el) { + body.insertBefore(el, firstChild); + }; + } else { + addNode = function (el) { + body.appendChild(el) + }; + } + addNode(togglePassed); + addNode(dom.SPAN(null, " ")); + addNode(toggleFailed); + addNode(SimpleTest.report()); +}; + +/** + * Tells SimpleTest to don't finish the test when the document is loaded, + * useful for asynchronous tests. + * + * When SimpleTest.waitForExplicitFinish is called, + * explicit SimpleTest.finish() is required. +**/ +SimpleTest.waitForExplicitFinish = function () { + SimpleTest._stopOnLoad = false; +}; + +/** + * Talks to the TestRunner if being ran on a iframe and the parent has a + * TestRunner object. +**/ +SimpleTest.talkToRunner = function () { + if (typeof(parent) != "undefined" && parent.TestRunner) { + parent.TestRunner.testFinished(document); + } +}; + +/** + * Finishes the tests. This is automatically called, except when + * SimpleTest.waitForExplicitFinish() has been invoked. +**/ +SimpleTest.finish = function () { + SimpleTest.showReport(); + SimpleTest.talkToRunner(); +}; + + +MochiKit.DOM.addLoadEvent(function() { + if (SimpleTest._stopOnLoad) { + SimpleTest.finish(); + } +}); + +// --------------- Test.Builder/Test.More isDeeply() ----------------- + + +SimpleTest.DNE = {dne: 'Does not exist'}; +SimpleTest.LF = "\r\n"; +SimpleTest._isRef = function (object) { + var type = typeof(object); + return type == 'object' || type == 'function'; +}; + + +SimpleTest._deepCheck = function (e1, e2, stack, seen) { + var ok = false; + // Either they're both references or both not. + var sameRef = !(!SimpleTest._isRef(e1) ^ !SimpleTest._isRef(e2)); + if (e1 == null && e2 == null) { + ok = true; + } else if (e1 != null ^ e2 != null) { + ok = false; + } else if (e1 == SimpleTest.DNE ^ e2 == SimpleTest.DNE) { + ok = false; + } else if (sameRef && e1 == e2) { + // Handles primitives and any variables that reference the same + // object, including functions. + ok = true; + } else if (SimpleTest.isa(e1, 'Array') && SimpleTest.isa(e2, 'Array')) { + ok = SimpleTest._eqArray(e1, e2, stack, seen); + } else if (typeof e1 == "object" && typeof e2 == "object") { + ok = SimpleTest._eqAssoc(e1, e2, stack, seen); + } else { + // If we get here, they're not the same (function references must + // always simply rererence the same function). + stack.push({ vals: [e1, e2] }); + ok = false; + } + return ok; +}; + +SimpleTest._eqArray = function (a1, a2, stack, seen) { + // Return if they're the same object. + if (a1 == a2) return true; + + // JavaScript objects have no unique identifiers, so we have to store + // references to them all in an array, and then compare the references + // directly. It's slow, but probably won't be much of an issue in + // practice. Start by making a local copy of the array to as to avoid + // confusing a reference seen more than once (such as [a, a]) for a + // circular reference. + for (var j = 0; j < seen.length; j++) { + if (seen[j][0] == a1) { + return seen[j][1] == a2; + } + } + + // If we get here, we haven't seen a1 before, so store it with reference + // to a2. + seen.push([ a1, a2 ]); + + var ok = true; + // Only examines enumerable attributes. Only works for numeric arrays! + // Associative arrays return 0. So call _eqAssoc() for them, instead. + var max = a1.length > a2.length ? a1.length : a2.length; + if (max == 0) return SimpleTest._eqAssoc(a1, a2, stack, seen); + for (var i = 0; i < max; i++) { + var e1 = i > a1.length - 1 ? SimpleTest.DNE : a1[i]; + var e2 = i > a2.length - 1 ? SimpleTest.DNE : a2[i]; + stack.push({ type: 'Array', idx: i, vals: [e1, e2] }); + if (ok = SimpleTest._deepCheck(e1, e2, stack, seen)) { + stack.pop(); + } else { + break; + } + } + return ok; +}; + +SimpleTest._eqAssoc = function (o1, o2, stack, seen) { + // Return if they're the same object. + if (o1 == o2) return true; + + // JavaScript objects have no unique identifiers, so we have to store + // references to them all in an array, and then compare the references + // directly. It's slow, but probably won't be much of an issue in + // practice. Start by making a local copy of the array to as to avoid + // confusing a reference seen more than once (such as [a, a]) for a + // circular reference. + seen = seen.slice(0); + for (var j = 0; j < seen.length; j++) { + if (seen[j][0] == o1) { + return seen[j][1] == o2; + } + } + + // If we get here, we haven't seen o1 before, so store it with reference + // to o2. + seen.push([ o1, o2 ]); + + // They should be of the same class. + + var ok = true; + // Only examines enumerable attributes. + var o1Size = 0; for (var i in o1) o1Size++; + var o2Size = 0; for (var i in o2) o2Size++; + var bigger = o1Size > o2Size ? o1 : o2; + for (var i in bigger) { + var e1 = o1[i] == undefined ? SimpleTest.DNE : o1[i]; + var e2 = o2[i] == undefined ? SimpleTest.DNE : o2[i]; + stack.push({ type: 'Object', idx: i, vals: [e1, e2] }); + if (ok = SimpleTest._deepCheck(e1, e2, stack, seen)) { + stack.pop(); + } else { + break; + } + } + return ok; +}; + +SimpleTest._formatStack = function (stack) { + var variable = '$Foo'; + for (var i = 0; i < stack.length; i++) { + var entry = stack[i]; + var type = entry['type']; + var idx = entry['idx']; + if (idx != null) { + if (/^\d+$/.test(idx)) { + // Numeric array index. + variable += '[' + idx + ']'; + } else { + // Associative array index. + idx = idx.replace("'", "\\'"); + variable += "['" + idx + "']"; + } + } + } + + var vals = stack[stack.length-1]['vals'].slice(0, 2); + var vars = [ + variable.replace('$Foo', 'got'), + variable.replace('$Foo', 'expected') + ]; + + var out = "Structures begin differing at:" + SimpleTest.LF; + for (var i = 0; i < vals.length; i++) { + var val = vals[i]; + if (val == null) { + val = 'undefined'; + } else { + val == SimpleTest.DNE ? "Does not exist" : "'" + val + "'"; + } + } + + out += vars[0] + ' = ' + vals[0] + SimpleTest.LF; + out += vars[1] + ' = ' + vals[1] + SimpleTest.LF; + + return ' ' + out; +}; + + +SimpleTest.isDeeply = function (it, as, name) { + var ok; + // ^ is the XOR operator. + if (SimpleTest._isRef(it) ^ SimpleTest._isRef(as)) { + // One's a reference, one isn't. + ok = false; + } else if (!SimpleTest._isRef(it) && !SimpleTest._isRef(as)) { + // Neither is an object. + ok = SimpleTest.is(it, as, name); + } else { + // We have two objects. Do a deep comparison. + var stack = [], seen = []; + if ( SimpleTest._deepCheck(it, as, stack, seen)) { + ok = SimpleTest.ok(true, name); + } else { + ok = SimpleTest.ok(false, name, SimpleTest._formatStack(stack)); + } + } + return ok; +}; + +SimpleTest.typeOf = function (object) { + var c = Object.prototype.toString.apply(object); + var name = c.substring(8, c.length - 1); + if (name != 'Object') return name; + // It may be a non-core class. Try to extract the class name from + // the constructor function. This may not work in all implementations. + if (/function ([^(\s]+)/.test(Function.toString.call(object.constructor))) { + return RegExp.$1; + } + // No idea. :-( + return name; +}; + +SimpleTest.isa = function (object, clas) { + return SimpleTest.typeOf(object) == clas; +}; + + + +// Global symbols: +var ok = SimpleTest.ok; +var is = SimpleTest.is; +var isDeeply = SimpleTest.isDeeply; diff --git a/frontend/gamma/tests/SimpleTest/TestRunner.js b/frontend/gamma/tests/SimpleTest/TestRunner.js new file mode 100644 index 0000000..81a36cf --- /dev/null +++ b/frontend/gamma/tests/SimpleTest/TestRunner.js @@ -0,0 +1,233 @@ +/** + * TestRunner: A test runner for SimpleTest + * TODO: + * + * * Avoid moving iframes: That causes reloads on mozilla and opera. + * + * +**/ +var TestRunner = {}; +TestRunner.logEnabled = false; +TestRunner._iframes = {}; +TestRunner._iframeDocuments = {}; +TestRunner._iframeRows = {}; +TestRunner._currentTest = 0; +TestRunner._urls = []; +TestRunner._testsDiv = DIV(); +TestRunner._progressDiv = DIV(); +TestRunner._summaryDiv = DIV(null, + H1(null, "Tests Summary"), + TABLE(null, + THEAD(null, + TR(null, + TH(null, "Test"), + TH(null, "Passed"), + TH(null, "Failed") + ) + ), + TFOOT(/*null, TR(null, TH(null, "-"), TH(null, "--"), TH(null, "---"))*/), + TBODY() + ) +); + +/** + * This function is called after generating the summary. +**/ +TestRunner.onComplete = null; + +/** + * If logEnabled is true, this is the logger that will be used. +**/ +TestRunner.logger = MochiKit.Logging.logger; + +/** + * Toggle element visibility +**/ +TestRunner._toggle = function(el) { + if (el.className == "noshow") { + el.className = ""; + el.style.cssText = ""; + } else { + el.className = "noshow"; + el.style.cssText = "width:0px; height:0px; border:0px;"; + } +}; + + +/** + * Creates the iframe that contains a test +**/ +TestRunner._makeIframe = function (url) { + var iframe = document.createElement('iframe'); + iframe.src = url; + iframe.name = url; + iframe.width = "500"; + var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0]; + var tr = TR(null, TD({'colspan': '3'}, iframe)); + iframe._row = tr; + tbody.appendChild(tr); + return iframe; +}; + +/** + * TestRunner entry point. + * + * The arguments are the URLs of the test to be ran. + * +**/ +TestRunner.runTests = function (/*url...*/) { + if (TestRunner.logEnabled) + TestRunner.logger.log("SimpleTest START"); + + var body = document.getElementsByTagName("body")[0]; + appendChildNodes(body, + TestRunner._testsDiv, + TestRunner._progressDiv, + TestRunner._summaryDiv + ); + for (var i = 0; i < arguments.length; i++) { + TestRunner._urls.push(arguments[i]); + } + + TestRunner.runNextTest(); +}; + +/** + * Run the next test. If no test remains, calls makeSummary +**/ +TestRunner.runNextTest = function() { + if (TestRunner._currentTest < TestRunner._urls.length) { + var url = TestRunner._urls[TestRunner._currentTest]; + var progress = SPAN(null, + "Running ", A({href:url}, url), "..." + ); + + if (TestRunner.logEnabled) + TestRunner.logger.log(scrapeText(progress)); + + TestRunner._progressDiv.appendChild(progress); + TestRunner._iframes[url] = TestRunner._makeIframe(url); + } else { + TestRunner.makeSummary(); + if (TestRunner.onComplete) { + TestRunner.onComplete(); + } + } +}; + +/** + * This stub is called by SimpleTest when a test is finished. +**/ +TestRunner.testFinished = function (doc) { + appendChildNodes(TestRunner._progressDiv, SPAN(null, "Done"), BR()); + var finishedURL = TestRunner._urls[TestRunner._currentTest]; + + if (TestRunner.logEnabled) + TestRunner.logger.debug("SimpleTest finished " + finishedURL); + + TestRunner._iframeDocuments[finishedURL] = doc; + // TestRunner._iframes[finishedURL].style.display = "none"; + if (finishedURL != null) { + TestRunner._toggle(TestRunner._iframes[finishedURL]); + TestRunner._currentTest++; + TestRunner.runNextTest(); + } +}; + +/** + * Display the summary in the browser +**/ +/* +TestRunner.makeSummary = function() { + if (TestRunner.logEnabled) + TestRunner.logger.log("SimpleTest FINISHED"); + var rows = []; + for (var url in TestRunner._iframeDocuments) { + var doc = TestRunner._iframeDocuments[url]; + var nOK = withDocument(doc, + partial(getElementsByTagAndClassName, 'div', 'test_ok') + ).length; + var nNotOK = withDocument(doc, + partial(getElementsByTagAndClassName, 'div', 'test_not_ok') + ).length; + var toggle = partial(TestRunner._toggle, TestRunner._iframes[url]); + var jsurl = "TestRunner._toggle(TestRunner._iframes['" + url + "'])"; + var row = TR( + {'style': {'backgroundColor': nNotOK > 0 ? "#f00":"#0f0"}}, + TD(null, url), + TD(null, nOK), + TD(null, nNotOK) + ); + row.onclick = toggle; + var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0]; + tbody.insertBefore(row, TestRunner._iframes[url]._row) + } +}; +*/ + +TestRunner.makeSummary = function() { + var base = MochiKit.Base; + var dom = MochiKit.DOM; + var iter = MochiKit.Iter; + var total_Ok, total_not_Ok; + + total_Ok = 0; + total_not_Ok = 0; + + if (TestRunner.logEnabled) + TestRunner.logger.log("SimpleTest FINISHED"); + var rows = []; + for (var url in TestRunner._iframeDocuments) { + var doc = TestRunner._iframeDocuments[url]; + var nOK = withDocument(doc, + partial(getElementsByTagAndClassName, 'div', 'test_ok') + ).length; + var nNotOK = withDocument(doc, + partial(getElementsByTagAndClassName, 'div', 'test_not_ok') + ).length; + var toggle = partial(TestRunner._toggle, TestRunner._iframes[url]); + var jsurl = "TestRunner._toggle(TestRunner._iframes['" + url + "'])"; + var row = TR( + {'style': {'backgroundColor': nNotOK > 0 ? "#f00":"#0f0"}}, + TD(null, url), + TD(null, nOK), + TD(null, nNotOK) + ); + row.onclick = toggle; + var tbody = TestRunner._summaryDiv.getElementsByTagName("tbody")[0]; + tbody.insertBefore(row, TestRunner._iframes[url]._row); + + total_Ok += nOK; + total_not_Ok += nNotOK; + } + + { + var tfoot = TestRunner._summaryDiv.getElementsByTagName("tfoot")[0]; + tfoot.appendChild(TR(null, + TH(null, ""), + TH({'style':"color:green;"}, total_Ok), + TH({'style':"color:" + ((total_not_Ok == 0) ? 'black' : 'red') + ";"}, total_not_Ok) + )); + } + + var testRunnerResults; + var i, c; + + testRunnerResults = dom.DIV({'style': 'display:none; visibility:hidden;'}, null); + + c = total_Ok; + for (i=0; i. + +--> + + + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css b/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css new file mode 100644 index 0000000..3847475 --- /dev/null +++ b/frontend/gamma/tests/tests/Bookmarklet/Bookmarklet.css @@ -0,0 +1,201 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* @override + http://localhost:8000/tests/js/tests/Bookmarklet/Bookmarklet.css + http://www.clipperz.com/files/clipperz.com/bookmarklet/0.3.0/Bookmarklet.css +*/ + +div#clipperzBookmarklet { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; + + position: absolute; + top: 80px; + left: 100px; + width: 202px; + height: 202px; + background: url(./background.png) no-repeat; +} + +div#clipperzBookmarklet div#clipperzBookmarkletClose { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; + + position: absolute; + left: 168px; + top: 5px; + width: 25px; + height: 25px; + background: url(./close.png) no-repeat; +} + +div#clipperzBookmarklet div#clipperzBookmarkletClose:hover { + background: url(./close_selected.png) no-repeat; + cursor: pointer; +} + +div#clipperzBookmarklet div#clipperzBookmarkletResult { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; + + position: absolute; + width: 145px; + top: 61px; + left: 27px; + height: 63px; + overflow: hidden; +} + +div#clipperzBookmarklet div#clipperzBookmarkletResultIcon { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + + width: 28px; + height: 35px; + position: absolute; +} + +div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.ok { + background: transparent url(./info.png); +} + +div#clipperzBookmarklet div#clipperzBookmarkletResultIcon.fail { + background: transparent url(./error.png); +} + +div#clipperzBookmarklet div#clipperzBookmarkletResult p { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; + + font-family: Helvetica, Arial, Geneva, sans-serif; + color: #898e7d; + font-size: 14px; + margin-left: 35px; +} + +div#clipperzBookmarklet div#clipperzBookmarletButton { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; + + position: absolute; + top: 125px; + left: 26px; + width: 148px; + height: 49px; + background: url(./copy.png) no-repeat; +} + +div#clipperzBookmarklet div#clipperzBookmarletButton span { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; + + display: block; + font-family: Helvetica, Arial, Geneva, sans-serif; + font-weight: bold; + font-size: 14pt; + padding-left: 60px; + padding-top: 12px; + color: #838975; +} + +div#clipperzBookmarklet div#clipperzBookmarletButton.hover { + background: url(./copy_selected.png) no-repeat; +} + + +div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint.hidden { + display: none; +} + + +div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; + + position: absolute; + top: 78px; + left: 135px; + width: 171px; + height: 72px; + background: url(./hint.png) no-repeat; +} + +div#clipperzBookmarklet div#clipperzBookmarletAfterCopyHint p { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-size: 100%; + vertical-align: baseline; + background: transparent; + + padding: 10px; + font-family: Helvetica, Arial, Geneva, sans-serif; + color: white; + font-size: 13px; +} \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Bookmarklet/Fail.html b/frontend/gamma/tests/tests/Bookmarklet/Fail.html new file mode 100644 index 0000000..9a95bad --- /dev/null +++ b/frontend/gamma/tests/tests/Bookmarklet/Fail.html @@ -0,0 +1,113 @@ + + + + + Bookmarlet TEST - fail + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Bookmarklet/Twitter.html b/frontend/gamma/tests/tests/Bookmarklet/Twitter.html new file mode 100644 index 0000000..c9ee827 --- /dev/null +++ b/frontend/gamma/tests/tests/Bookmarklet/Twitter.html @@ -0,0 +1,113 @@ + + + + + Bookmarlet TEST - ok + + + + + + + + + + + +
+ +
+ Please sign in +

+ + +

+

+ + +

+

+

+

+

+
+
+ + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Bookmarklet/ZeroClipboard.swf b/frontend/gamma/tests/tests/Bookmarklet/ZeroClipboard.swf new file mode 100755 index 0000000000000000000000000000000000000000..13bf8e396202964e0048333d878f4b949a2f5e6a GIT binary patch literal 1071 zcmV+~1kn3KS5pay1^@tfoPAa6Qrkup-d$aeB-A-xFjKf1te)pFM-&Q&_dOT zp~-XxqP4X~YJ}vGWC;KAD1C=MKwiO_PG6^Vbs@z~r#qgr-}!Xr?4IxJ9P1kT4dpSa zmlT9hja*+}e;Cbih*6`(JT|+I(1(#NIVSiTL~Dq=|Lb=d5tOYL`L;_#dyQQ%FAAmI zcth~a_gzLk@xphk!Y?fFYp&C2`ZTZ#X}INt9hY9ojZWZ1Om23g$oC2%i(XLAs&#|V z5ArS7X}yhomj%SJGT~|rnZj|zM|I&j59e1QKqGxQN5!(ijWrx1S)ZN!RwWBwC`$uYc z!)028S7F4?l?H2dd39HKImh$+mv#S~I-YjmQ;P-rUfUM~-;Xr+ldpAXK+hS!b|@Ro zUs)@fv!kf9RjpFXZ?d(Pe_q{bY*sgP{Ykaib==7Da_N!X$Z^AwK5e&BZ5R56j>T=;_5DD$nR8}GiWShym;5A&x*eM;)Us-}<67Eb+@9n>sdlhm z`(coON!$a6H-ML=9U8}t-8aV1yD!xY9v@|7-FWq*lEUMka&b=Hq$X{>72}4eNl_P+ zccPJWGtXb!r#GbVPIO$}sN%oME%Yf<`b@|2f6G5y#$}-l zAR|D=L6`ti0Wt|N4P*v{Ss-&j?gE(yvY_TMkQE@SK-Pd%f#~WwXExMLZXW@84CD#m zFMxar!IU~i}ZGSTvX;GX_!`A@yKkIbSu*e=l_b9m*BF@hOB8SS;p?XkU4 z+#Y{FagI+_hF#pQ*y^c#B7H9*TQ=n-IvJZOQ*KYMV&e{u!2((~XOiIAy*Zr0yBr$x zqA6D~T{u}ZWn+;Cn@jC`refSD34E}PZ{YGaxq%P2g&VlCEyl30qM2Z<#-M2CQxMno zG_4J8H7mc8(VenQzJ;=@j=BiTh*RubMeS$61ORcM^S6!u6l;=?s|@ py1A~K8@jovn~!u;;=k8uI$3rc`gC{*rT-s&a~N%N=5J58nk1s|4c7nw literal 0 HcmV?d00001 diff --git a/frontend/gamma/tests/tests/Bookmarklet/background.png b/frontend/gamma/tests/tests/Bookmarklet/background.png new file mode 100644 index 0000000000000000000000000000000000000000..db5cdc33e9a279f2bd99428a31541567e5fae2ca GIT binary patch literal 10335 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 WGqn9V%li!*Kw4ZutVYBz@c#hJ5|*g| literal 0 HcmV?d00001 diff --git a/frontend/gamma/tests/tests/Bookmarklet/close.png b/frontend/gamma/tests/tests/Bookmarklet/close.png new file mode 100644 index 0000000000000000000000000000000000000000..c07f0cb0fd44263aaf838dfe60a363cd4cc1fcfc GIT binary patch literal 3984 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 B#LNHy literal 0 HcmV?d00001 diff --git a/frontend/gamma/tests/tests/Bookmarklet/copy.png b/frontend/gamma/tests/tests/Bookmarklet/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..299c61372400a794d73679c8dd05133508064a01 GIT binary patch literal 5241 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 literal 0 HcmV?d00001 diff --git a/frontend/gamma/tests/tests/Bookmarklet/copy_selected.png b/frontend/gamma/tests/tests/Bookmarklet/copy_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..f7015b76f3ee0f171f1aa92beee56a365b5c1215 GIT binary patch literal 5169 zcmV-16wd33P)4Tx0C)kdmw7x??;gjWSs2ThVKBBZvdfyC>{}w)6-pYrVaAeF%94~dODI}U zRESEXRJ4#KNeWT6iY(c)WV>eu)xEFR@7{mz^Lm{*pYxpaoHH}eyx-4!0l-STQYa)i z0Km^bIMCWepRjkIBLVdhzyJd3R0guH#2|{ErKLG^^bc*W9l9E7Z8Fq*4U*GT!3w3( z;Bl(!7o!6$|1fB?8xsgU5CE7o)WPAoo^`4D(0aC|<|DzBVCWhzY9@NQxjOa7v$i%P2EDgb09I1g)|T?t)>f_ofcOMJ4T*R- zFobq3^g&?F0Q|4x_0PO90s&19G{Gd?AskW_I5fVo$fk++W+}Lk4x{tzC&o@L$|N)-#i9AhrGUf5BqYG zp85UoA16;xCIhAdr-NpLXAl1jnL9Ecx^Q&y*stTuVaq30!X+a z&!S=(;uzzZ5||UwNi63u$=DRuRJJtSdG>UU49-ma1+I(SSv=Xim-sGkxx#-{AV)Bl zkSBC)>viFLkpj^h;y1-_Nfb&JNfnJ2lWt3w$dt<6k-w{OPoZr4eWh~c3YChv2O*WJ z57i!NRB1lm@npwSt*5Ki;WawXbf4?J(0^%Ai>!^VGkRrQZ_;4eXxhZo6#v?++5C+~ z3#R4VTgz6fch+sVw$%4FA8gz0I`AEtoem%Ob~$$Qc4vQb{_NbdzgM95YM)F0!2zLx zyf25o62G|(iVhYGd3^UA_8O5KDIE0~^Zh{@ml-da@Sh}4QKl89@680x2K@}4Q=Y4s z4_OFZJo@YClEzZi^6{0hRjt*hYirQ_3&Sz+NkkK}h%Svj4CTpS%V@x)#4L^$XW_=GPmoaXogTtVDPJf*x%e8c?g0xE)@gbPBigkd6Dq5)!e#U~^sq)6MU zWDv4?aw+ot+a(oalsZ(TR4Hn;8eE#8J6>z!b;!EU^+gPh8@3t?n1t?pV!CLiVD7#< z-J;bJV`X9;YLjpK-k!-pcW=PH%Z_zU6Z-`Z>~T4EFweF2(6Ae)yN<_R&y!v`-Zeg- zeHZ=M{kM?~DP93#fyqI6!R3eRL%NTQgw7p99A^t7oRB`L9IhK-7P%+N>D0k!_tT`9 z;4^_|BVr@sPQ}M2q$b8EWu3d2oSBl6dMPdSd`9|(jGLJ^E|grnnN^fsdg<}y$5(2v zzRqdQZOd!B)^@!+|7*d}je(orZcP+U6-^Y6-<~d+C>^~sc6aDrf7!tOuJYE3h6gp3 z4<432x>S|=IO2)lQ>SXPnjO!ip5vY`zUX_|SbM)N?NwmCO@m4!U*lR+*X#Suac>-3 zgj)vRmbIREXVivi`}{uVgHO9+`$|W1XWGa8U6Nfh-H$#+eKzai=;`Ub)fd#SIe;8! z{Br*5fp6m9#s(h^MSkBk%sKpd{ zUVQf=Oh0?_`w`EJ@O6Bh;+=bjwrgWc*jB15isM>=1Bgha{ zJ05F2(LSlYs#C37qxTH*#0$e{BcxF+rERVTg02A&0p_shK$i-nQX-hIpdv8 zo9%nMcKZwmJk=ZfK00)(zq_;#)+LCXM}@ zMP`0mr1Gd5%_B=xkDOc$UyB4$@ZTmuQB4xt5VtFyIRQ;`2{xHEh3&UX@R?i}xHnv~ zhzn zEMoRLXPer{1nrp*c;ogJdp6!ZBTP4W!QVv=Lczm zJQX+VICpL_e#M$P|LbcXbxojG0U%==0QOk`*yI5a17&d+Xsv?QQA-v8Y}EmrP5{8Q zC;+xg3v8?((7MG6_<=0Y2m3$}NCtPn0*nANgN4Fw!rs7!;8?f`JQDr{zKqa9L?Y@C z%Sa*QK4by%C!I0fX}VIn33?OyT>3#2C(0T1gaO5%&JfKo%BaCeW~^b7VTxd?WX3Q@ zGJiyKp#9O`S&UdtvGikHG0(9GtOs_C)rvKPb%iaKZ5pS6%V$?*&u5?DaN(He^yaL< zZ^OUh^58~s7xIYm9O0Sez07CAH?t*&UxYtQ047i_=tB@9bP1i`x^-)WFjlxlBt_It zj8|+xyhy@8;+CYo6q{84wle86GS0G!a%j0B`IicL+oKfSluVSRRoGRQRR`5F)iLTd z8h12vcbwNcs~xU$L^nW>r0;FuW$0z(YwT|lyz{te^saMe+2*%)S6Vde`D8g|jj|E2 zRkO3Pr#K|-E!p?hamJZ@zxDwSm*j(0uHT7VZYJ(WJ&L`#eJp+BNVWcOvK}Qe;6)I9 zu-W0%P?4kLV~@j_PB@+{hJKT_(eTsGF%QnN#|Ff;CZ;DXCcC86rOBPo$_%>jCCete z_DV^PXzt}}Tm`H*l5SxN&)v=}<-c?No=mx6MQf$&!>K1+Pm62xUj)};>x%1lHN`c{ zylH(K(pL9@(!tkR|4Hm~XK!4;&e!5Wx9@_(T|ew6@RJ?WS+g$lV~gcW;cMJ9f4~6~ z-~y6B2kZrhK{}`eJunnZ9_9i|f>pz2;8JiGcozIU0*ly>Bw$60-ZPA z9l8a21Nw9HA5o&H!>AVwI0iR{N=9ZzXT}mHB+~(=`^-$tMCNKVCz^t8W|3k^WEsPl zV@k0sSTeSqRhRWT8-^`}ts7^IyUR{sPi0@_2;%s`>BBjKC*h~Lg1P3nkMY2G5_oxe z3;ERf>bBT#8Rm}=;1Q@0v=SU4#0ZHA)o=9|<`RA?LKH=dJ`?j77ZiUd5i6-Lxgu4y zElgTVdS0el_N<((ypa5aLiP3(MIR+YWdY?Sl@HKDe_1_J!&B2?hnAL{wvY}^7paHP zo7SH)m@phQ8Z@3U8QuAF7u<})oNKp&h4!93mey9j)<azLT9+YL#zXQ%FSjiBYL7`TNpE+bOy3WFeExRiY|8gQiJ*|+h7kTEL7|PugpVhM zjhx&UULUCvl^=~eopc6wHY1KZK08r4=}oeG%CEG$na+!ywN|f44FOFl%{eWPTYK8p+66nc zy4*g+_dMzw`@-{0e<))3=IGaP-bs(?E3f)`X;^C(>D1n#%&T@R=LS=)v0xgpLK0=+%Vh}_xfdX29@P^{8XCT?{vg; z)^~+KMEmv_Qkfn&1O0<6{x&z*29fPMVmc}@hWcSYUN8|e={dD?T55)QW_s$M|9kNx z9foQ$TBDYvXm@`*8)%P%HVN-wQ(7$uWes2e$bbZGfq($ap(DeMR{|jZKI0A5w6t0d z8Ug580l4HqP1Os>BdGhoTd;d5RObO;K&BiG^!D@$Cg?$xth+S9)SoCTP1r6kuMYkN z&msjLewQxt00009a7bBm000XU000XU0RWnu7ytkV14%?dRCodHom)&)M;OPyy|Bwg zSVUM@(Xyxz5X1{=wQBK_h(+|Ft?7eFlO~N1?UQYcwM`AhG%EPgrio2_vq@hX+q72G zs(8Utw5DD|RX{P^c9;9IT=#NL=bQD=U6-W`*@I`{n*?Uh%r}?w+b?tG{AbQt018AP zj098@)m47{z&U16;%g%UoIiZ9awn!y{_N)C>le~zKZiPUh$q$lbrozK7T;{jpW%E`lGEJl*A@LeI5PNM)y1=UE`W38 zpPV=+Il-7id7Vl9BY;Z3X4PwuK0iaUp_m8+5O6r`P<8D*h$1-Mp3#!>&%UlgBQ^dj zE88;%w3^fCOj%2ok~1L`3KJ5Dk2gRz^A(i}bWs}pnS;mn8L$9%D7DV~0sAyBB{>!H za+Xh65oHnqiNI3kE9?@;#vw4osphD-}I8X;e$62+YCWs)t$L?9#rS&MVHod}xU z_<=i=qr2h5Et_@>&r3=PsS+|G0uljZiV2qIuNo0WXBnoAP0AnC-DZja1tKst0?YDN zabMyi)R8au?{9qiXlgZ4saa2;udfHnkA7T;Ah<&bYHdZ`!@IK{3;~!Lfts6_*`-c> z5leH2Qma8LGC_d?5ts@Amy5}pYM6^$c%8`F2KN5m zfTlV+t>E!^K%>zFW?HYm7;v6tMTh8^z09mU1gaCRG=14kbmg>W<)8R6{( zZNlSmb9-ETrVv>KR`;8R1_kUfY+f=hl-8~ z+Zm*#1z?ld=AYC;d@ycJ+hN#wePVc}w*5evA?AX!qZd;+LL0SNNxP{~O~&}yRq zmsLQw05)#k0Li-X215Y`?cLDc`V4&U2~oSsG-oNFB=wLJkX4707~i^G18wci?9d2B zrQ5tKhf*ew2jKRFv(W7HOXLS?wpv}X{Y~zafw`2TL;{iy#plDgA4;p!7bne44qIPw zeGUaqfI)Car-9zl0(JMU!~G6DWToT6v&BuHQz;VCGe0P0Yg zSt-9>sj9W`>yRA#p>PRB#U6>k(02b4{BidVwAn{s)Yc64=Zs7l=I5URBf8rQWTMm* zS#>Dsq;*lcAiD=F(9$^o!*(k)v<4S3ZEPMzd$c5)%8q??C|S3!pnTBP-4Q^e@#a}* z3`q4)aJrn()7urqDgABfNI3+?yY&iN?}Do4A+(^?Xkln*AOuS?Q4#@J_d~_S#Y6m@ z1aJ)Whjh*{(XoJ|nu+OH$@7fh)i**aN=7e{z_jd#lFknuWFm)3WOsAiiI|HNi1+4R9$mXI%K1cnm@jbm&4T5`GBJmg~%r$yACBG!X+JxwS_rPI^<;M zvki1>A!FepNK8zED5j=Uhg0BuGt85U#jHv5VBtQ-|MQ~JXd;(sF3iE!b@tdO5nM%NSKNNQ; zd@gVErsA1;zI0wP6F?ox;v@5Nz)E|Wt=`4A!TtWV>I;RA0lVKseNkpM6yz1M_W^m}O7-t-Yl^f( z+}j7rpW%GW+0Oj@m3Kt&{KQ_OxzR1cx8;W_FGwE9M=0r_>`>)zhd-^XC@3gA_4Ap^ zP5lo03$F$i#D*vJU*Rp{PiHFhEWb`F>y0UY#`Aeve{y-=>UG4Tx0C)kdmw7yt-yX-$ER1E$Fc@1H*=5a=CHt00c3DaqyJ2ier7THVvxK6> zo-HbosHlEKlB5u&sK}B%OSb#Wpt|?<>fV3udA(+y&vTx0o>|Vk-)Fu6U?rXX{77&B zfRArbfQ6wB;eeez0rd{R00Qb%1k%pLKtF9WGZX0SFKxaH8V$8hDayV6GU#vJm;mSn z0f0$D1K8X*vKA#D*~nIud@RT>2pZ!-$wUul7bu59Su()NLKn(KP{z1#&v<8>#KPHAl?JeKq4Lu2&RsOJ_xK0fd6&A@tHSg zAfUy878oW3D}(MtdoMSwXj$w+&R5N?9B;%4hdsV|j(D?^9{YUvogh#8P5Dm;%mmH_ z%^m#_Jb!EzsE>FgQ!OB|OuGr6+3ukc*mc8&KsUp9XZAy*)8d%j?SP@(V*(IU}e zu@do8iPEt$(oM;7sS24}vbW{#$W`vVt5Bs_tyDdKFSuscedSu!I<*J8AMSpn{%EZ} ztU>d!))VcgI{)Z4A{(Qc^q(0t8@3odH)>^QjeB9-X7bXs9n*f{m05@RYl}`?XUZGP zw^m)&-T3Z|9@}>ZdhPqT`?B6UesJtR_>u49^-oR%hX(})b3Y&XLj3A7Bs^3&?Doxl z#A8%^v}DX{-1|FeLTaLX(sznH?KdMgb7wYSF7QXtyyATILhxe9((#|imsOYRR!**l zuBop*T3?6OUl5LgPa#^7r8KFup(uAcD|%f91x8V{C=(}!1Ix+G$-<5kVHIOjW;ekf z;t1qS?LAhjX19kBqpmyK1@}a6j#l?b+bm1pb8z3W(UAEQh?6X#gj15I6~nZ`jU)C)I-EHi<$9JB9ds_>e0WTF?3uWj_>_dW z#LNqqlQNQ%Q?8_@Tue{9lwOo^<5KzMqRi5)iYpJUKDgF+{Y7?1PG@dsUT1z^!I#3} z8-qn(iziE_ODD@FZqAfXR*c;mzdd|spmOkTZ&gQi%e{u0d-p49uhgYH2!H7F$f4f2 zVfSN+C%7j|Pe1+hyzy>R>a&1m%NC{QJkQr#dtcmbi+yR|F4#Wwsl~dQ#sV>=o~w?W=ts`N6oKt-t?c@u$E6wL#?I^UoK*9QrEyb$qCHIO5yh z5%!S}qxoZ`amDeq?=2H4lMYitQ{&T>GoiDFbGW&l9|iN|1(ij_;FfEtTDh{S7{yBc1aSS0;BBWP>Zbj=UfEuJdOTas+a==LqHr!vB zc&ZnrkJN93T=8sAvr!9Vi#QXs$%}n$kTKfLlFXSQXS}xTw0dLRWs`1;r+CBeoqexE zmLm_<9Uq-O9scB;b41|CAn`NRABFBB8wT+j^)4kzlE(kdBD23NQgd9H>XBuNM^3MW ztw(@J_%D;7C?<(%iQOB=7>}m91e?U1%<{`6_zaFqoSQD$_NPm72lI$jn~2;H*|JHQ zpN+ZJRLh{KYw8xLa?HfK&}US)}4nZc>z3Rris7O+mTIk7FUd$L#Kci^9KxN)L5OSpu&j&aR# zU*$36ncbGnE5sYh2ji>a_aX=odIc_S-@ZLu5G&X&lq_s5!Ywi=S}LY1RxGX~!6GrR zqf+vml%uq~3|eMb_8+<2osse`3Wkc3N~}sNyM~lAR4^(Hs<+f~c3)IKuMwtsOv_)J zq~odUq35CRZQyGdwCAKz)ZPomStiB%YD`=9zc-t zgMO1%QSh^l(f7`?#`wo}B%~!SB{?NGrOI5)%m}>nIny$$@mhJdaL&~{jzZ=eiN%U>e7mU@EXoSTeSYS&KQJ1;Y}| z(uXs^-DV}Qrm(KD1+sl-_hKK#lkhVfK^*g(C%9l-@!Z_pB|IuTP1|g?jqrx^aq(62 zoAZwnq6I_*nz#E3atJ;WA_}90AB*^k@{7I}ixJlmUzMoa5h|%Jxgb?9eO|^&RzP-A zu6}2-yqAKWBA?>2(pzYwzp4_U>aJ$HTU}j7LqHR!h15o9&*)6+PU?;64;joFj_vue z7jDdE!m&@zRAc{sGYfNXi{qAAR(Gsl*!0=1*sw!B1WzW0j-Iv)YmQKgEQrFLO+1G? zpB~E@mzAKH_%g{g`DbcE+OG7km#$@cU9r9c-{b=u+ZM#|nen%9RRL z()Xn9i`5A~6swngtod|LqxmyZi+^i!TXy?{j{eT|F8&_%UYGZA{k5OQKXZN684e#Q z8v8QAJ>@oYZEk2mY{_@IdJRThe_AU46#6Obzusbhi~9}gkywa%3h|knysx1g>G-Ln zTTwZ`LZy6x%D4-}_h%~IffTlJcq-Y?saz-hV%n5zZj)y-3eB4=n{SZ3$#F15@gEHT zCU}$I*A#kxv-_LezjOQFsC6HpaQmOs2KW9aw~-}(k{iGCH@WGwTkKv{*`hZ;b&KCJ z+!n!=HCqhVo!OxHaqkw#EhDY5FaBvur?C8*mqK&bt?uZa=H6h4XzzYK3e$tV>VMJq~y}S2G=8l(0 zL70~dE<`86#6SUJJo^>vT=U^|WO^dObHUKt{FF%H44i9paWx_WRG6=*qVr^r0Ii6h z#X;NS-XHjdRuv50Qjm3R!zfXsnv^3lBu>rX36Yl%i#&#d`d~q%3eUyQM85sHR8Fl( z6wJFYCdG42u3L(>hwFA7#9E`4hM|)@>e=a|C!*NY4%Bv$>a`|DGh4zE!^-eUcAdLM zscNQ%WMQ9F;afVaAPTXS?;Gbd)A7zEXO(Sos3ekvh)|z0C^U{kE0gAyHVD+`QF?-j zj?v~lOiLFbT1F!CBG<1OHkm7gj3 zTfibp6{_@46rO_Q^@Yw1<$R9gTtLTaDUn1T{SGIt#zl0CS43{2uMmsVX!h8qv>b3+ zk)f|M`N*>}JC-!xQ@CCok3e*P;~FKN7&LPYICBs|((J7{S;p8e%cB{h-l|C5J9-gf z1o=Lu!^EX=>|<&-e^)$nFtO+kf6~#Pq8fl{Z$*Y-G0!kXlzRh}f=r*v!k|dHmd7vX zvSoveFe5C9u$(DYJvh*UpzxT1I5MYRjVoWoj7qqM(}@-?4=N$8seGwd8WhUbtVbQD z3J43E5_TwqmJ$%6_~O-M6Z8%-S$W)7FNv?kPFz=@l~Y{|uf+g1#FCm-{U>lYg;OAF zFNuIe4+&vdHBKx?@@;QP_9pIlE-qY=;+F^Y+a!({21S2Gn@bExgFS`MqSzO?Vloh7 zbn(#*2Y1?+tm6%F)$4J+;d!V@vex#ztmJ1_=4%0Hw$XoaQTj61H8cW`vl<2+RES`E z(8VPN(jZcUd$g>%EssPW25EsMU(WMK$*~_Et(q=1>IT6gDv~7P)+{QKH z$NRDTep5UQ%-UT# zp4GUe(O;Q!kphlYrE*G+Bt!OzJFlMJWOQ{lO z12Zm!>EMfdHuqc@HUxeu(t!P%j|PTAQCi_P#_VigjFfZT3oI%zdh#1ikG##n12Z!B zW6R4+t>t3Ws1T%K?UD1NbJI%{J?63N>WnvgE1MBk+Do${x zx`u>w_Z*`{YDhPX5ClO5lo%a?l$0P1 zqx19kXM7juoaZ^uIq%hbbK>Qodg6aWB#N>fA4@Sj%xg9bV2KaQ6o5eES7b~~x6 z>T9a1g7m#T9GqP30RVr3>dXMSv_*~|!@^1SxW`Q9Of&X_Xr9Xq4PU4hOPh_WX0fm) zv?1z4Po9WiN?BQm8oG$KxU3f~uibo!!+bhD-dqUX4fyPkH;l+bEnrLbIif@A700K!dU;<2G_B}F$eG5U?|M{XUIEL2Spf&R}oq8lFb z?*JPl1Yw#gMALJUSOy;8Os{ELkZ|uKa+Ve4J~bLRBY&(4RP;-~3S<8>{qHRvt1May z*pzGm>318DtXU#}$k5N8aYn#|RGPSj1yTHnegD>{7UFxsm>gnzBOp-JCltrWpGbF2 zh-rN(!%u0@!MH {Un-zXgC1yP5YBrV6WIbL{U}430Pje32zWW$(9nOhsH+e%;>* zcR!RZ{}@^D8i4r=gXKR6UofWtRQ7Fc4YY1;RR#b+3q&JITpU#7CCF$6@+zvZ+t(cj zS(0!NrYD?%iI-R?DqkszOVtT79#hEmcW7j5R8lm@R_-m*CgF#%SYX}56*San8jLMn z8kZ84Vr}h{gU(|8YY)Zgkrb=$!}P9<3Ic}wzc@q8KKQ6-8W$buW?8i&WcPYQjgwwf zEQn*!WoDHUMR^qm8VF-q%k}u(sE`un)TN}+!)k)JLYctx6=b+dlF3IkIl2e zv%5s{CmOM{$UT}6sfoR#gZ)x&$K~M6M>Vkdn7LT_jsT>8Ln_B*&}lA6??U%nj|@jV zL^8;JO(z%X%4v6SHWr`H_d?|bq&g-(wlg^@H(Z@_h^x?PXf#i~XQXHB$CGX`UJQK} z*cx5ehZ7JkZ%M3ja{ar_e5TEoDJ|BDZK>V2nDU>HAEFFK~%=Uq;bWsd#0w%cp6+g_<({Ic3uKJ-zG!_VL~vq_mIvNqsuNYRaB zwL+CLzJ7{+r&Q*4LxPL7@cmIf^HbJlCV5F`d&lHJn>mNWu}1dskfn5J?72%K!~)*W zI`Glda%%o;H;H4`kL=CPWy>XYK{mv5Tk$MqZ{=7ILKI6zLW)oXo~vAKiawMxmfAiU z4DPly4r;W+xy)V4I;l8+2paQCklT^umPEiMtik*0BkjvU$13};ddCj(e`K0uZka-A zVrt53<;`HRQ!rX&xE`ljO7YY3#sYpn8KF0pq$JM`8u{t@Vu%L%aDCs9^fnJ{jT|Ju z0+-2Gbyh2WyRR`X*{>Nb`|(-a^XDa}H)K3vY!#6a0P`yUGT@6wO=W0iuultsfz>0` z59peCI~yF8h>9>})xz}S zX=nERk8RG2tB(Uvw<95?^s$Is*0)J5b#2a{*gX|@Qg&v3AAb$(i=Ff%gANaODLw@W zJeDlmbVPVA){mmj>Elv`3!;qBr4PCqza?{@sLSL?v#q_!xX!;Uu&vF?C%>!X`Zi&H8i{NR6qYCWGgv&KVXFXPO z#^dv+)i%?%**AuZ?As6aa(60&f#+Xa@~b;Be8cCuXvUc3$}^Oahj zU7$Njp(#AKE%NF)XxbB@7f7WxQZZT?PZuj_h(WZp<^f6Yt0d{qx|bV@SM#X{A_f*; zRJ`c=nKX5fc1#Ah=A^xKjx$>oV9|a5<`?+{REFr&^9#pbg8Gfm8>S`1I)oA_0g4D& z?R(&8@pO^&`GjjKgqY|Wr)AXU0 z@RGojPlak&oy`)TR-Nc=k=9uhtKfrOL)45(HQR^wGDAw{5ALT#$FVG>;!{tznphfv zs(JnujKyy!JfbWPT=g0ZDD4uZ=o|YIgWXV1ehs2=S)B0p=IzEew)6I>?un)TUAwu# zwW=B1G?VPWTm|-<)f|M{?_SV>*d#D|my4D3faMs>qlx~0JIK}0DQt+a$l6S?Pf&-{ zMpvtcX`DSu#qjgSJH^kl{$P4r@`*URI|p|-z;kvNshyJzo;fMi_9nx}8E41M(avBs zvsQJ>z5gm&aKVc8tNlF~Cm#x;G$%l*juS3dOLW(~L>13Ylo+0b&|P^4wh64#H2nON zTe_g-GvhORqIS}MG}HNZH}jTB3?s#K+heccCKb?)z-`Goq2<_R;fkR)0`8L$*c;YB zpuHZ(gb)-=29U@Cy!=B*OJ#4s=U5wYVj#u~s4@oR#L#@1yau?|%1qBGVuBNy_X(Xa zMB7Rr4Z@FKxRL;3G0|TVtRLBQc?!?bau9@)!<5UoxoCCc9uxt_sG)IJ%C<^~jFJck z^b|@W)|b2o>8&PTq&iwY@@zDDv~n!G>krYA{sNqZx%j<6$1-ry239U>+; zj$W8>D~25|0f)e??Bi{+zLqajy!5MQsDogo>qY7Uu`gEqe&>6&czux4Zi#9|dJTHP z)}E|p&1Vb>b+h)9tyC_ba*@-%ApyHDcF0@M3QdF4gk43xiHP!>36=<%3fFLd<$6+A zXn2^DR@m5n*UaJN39xl8H{}pa5tD${s?ri_i%AnRek@2;@o~c27iO$jOIH%0GXTpj zS}ETuSTERf`|ZNixL#y1u|WA9%G-14tYd!CDVg1@1U-Zbn4AAPo8jf){}^bmxYZk= zzkIv7o(Em&Elr%_>s%;bY3 zLsCr*_8X9+r$Y_j&wltmEaCz4Nb^V*_gmm_RgwfAqAI@q7gT z#8(NgJ%bvMyh&NulSn-)-_62Fmqs5HSFF{&hEyp24kPdccwz2PhZTaTCc;9PD0nFm z5j@{EZ5ll9w9w1Z-;jns+g9!7{)N)%z3zQ#2c!!Bp8AJjkgFQJL-Nay-)6#K!bpZK zm(r3-p8GR*urv{RiMGq~Iq7pQTlx3wJF)JzXlpHNmLKn|1?zNPiZ&-g6Q%P>y6)k| zV#U79JMh$%)Ya6JV1wbOuYf(N`(kX$Z1^0$7Hf-xxw$zWIYBwyS=Z*|{TRI0feAhv z|MuPo5;fxYA1^7q$rbK#Q4~f46VDP36FV3Z>3-6|(#vM)1k1s#Ad^SIR^PQum3$3r zLg3i;%!oX${AKKzxnp5x#l3>f8izJ>OUvh~O7x}C6VDxoH*~fjo5_D^m~kw~o%4D| zcbvnwdc7fI+uIN^N`yz^N(R)_uL?GOG*dHOKQkcpPUZsG9#l5!G@W%5Cp_B4Gv2h| z)~`A@J}K07Sxxh{R$O{u&phmD2(UNfZ&Qa?dB?pv;|T&!$9 z#{hF?I_BM(XrK5w+*##U%~5S;jr|+T`VQVa-Bhu>(<02~_qF8>!)4tc6p^$2=@ceo zr$xJolXn#FS7ruRo%`q&o{JeKhPrs0`(8#OZ-$P+Hyp=SnWtXYP5Ivy5y6wp)Ib52 zOVO|LYZ3@IcSmK{KEKvCRL?C#%>-}nUkGe>F1!j&yrkMpc^MZ#agdeWUR%KS_pH3g z+(5chr8p?OzlE~<6fQU)e!tnvUvOr)+=B1=)vq)c_f)tT#bCB@wg;-c&+D<;0r2iE zuYc;|&--se8!ofwIuVzPWv_u4&&&J?($gEhk10H%Xx2`=Wb5BX^KC1WnGceRuM-zV z=NP`Gi<{s5nLC3y^V(zhA;Mi<|LDd^yR`1=eWnWHXZ7wz-k$~QILEyZd5ZDKbxbJA z9=0AU!-@T@p8UQ0yTPIxF9ly=>0Ie4P6H=81i^j2Fp$pgux@(X!PHcQH#%A$@t&qw z?{6~6m@J!&Zn`>_>c8-q(4Kf7p`5A1MMkURb6i$>+sOwUGbrONl+e;l@I7v7jzUUp zaQ!K^sG{&8U`Aoo0U!YVhK>h53lP^?JwmCIEmiTvJWi*q>l$`iYhW!To5PWMbDSpU5@i6l-Z#4Yw33JCg7!Zabox z*l1M00;um^)s7(r>0oPgBx>S<8gD7}Hh{)v=<0Mm8GmwmllvN+%ad)F&c;g`z7F!t zmTc9mK_{-t%naR}OfD>Jwcn%#Y2;aj9`adn?Yk0l975LnKCZei99vUo(H*-SDsVc3 z-ZAn$=E!?k+Gp>5%fGdrlT=0;UQ8ziDJWe1QOP#d7j(=@oS|iXWigz4YjJ-oeyDU$|Pc!sMNNP`#KZug zE~dr&P-%VDuqyFN!?Y^4GESwb_a*{brqmO(AeX_4`#eHq&i^V7CJE?tB5~qgvj)Lu zef{Aqgm%@?^bdAxN>l{csVXf4toQ%pxyRUrsYVl@%sX?)D#FeW?!J zLwIMg@pz$CuKOa@>EUro2 bxgt3n6gacOySV=QP=Mw$h+2(`b;SPwM?SI% literal 0 HcmV?d00001 diff --git a/frontend/gamma/tests/tests/Bookmarklet/index.html b/frontend/gamma/tests/tests/Bookmarklet/index.html new file mode 100644 index 0000000..729bf21 --- /dev/null +++ b/frontend/gamma/tests/tests/Bookmarklet/index.html @@ -0,0 +1,42 @@ + + + + + Complete TEST suite + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Bookmarklet/info.png b/frontend/gamma/tests/tests/Bookmarklet/info.png new file mode 100644 index 0000000000000000000000000000000000000000..256eb40bc42d2f8cfc94a34e52d013c4792d6e25 GIT binary patch literal 4781 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. + +--> + + + + Clipperz.Async - test + + + + + + + + + + + + + + + + +
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Async.test.js b/frontend/gamma/tests/tests/Clipperz/Async.test.js new file mode 100644 index 0000000..fa6daca --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Async.test.js @@ -0,0 +1,687 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +testObject = function (aLabel) { + this._label = aLabel; + this._sibling = null; +} + +testObject.prototype = { + 'label': function () { + return MochiKit.Async.succeed(this._label); + }, + + 'shouldHit': function () { + var filterRegExp; + + filterRegExp = new RegExp("hit", "i"); + + return Clipperz.Async.callbacks("testObject.shouldHit", [ + MochiKit.Base.method(this, 'label'), + MochiKit.Base.method(filterRegExp, 'test') + ]); + }, + + 'sibling': function () { + return this._sibling; + }, + + 'setSibling': function (aSibling) { + this._sibling = aSibling; + } + +} + +var tests = { + + //------------------------------------------------------------------------- + + 'succeedingForkedDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('Async.test succeedingForkedDeferred', someTestArgs); + deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedDeferred", + [ + MochiKit.Base.partial(MochiKit.Async.succeed, 3), + MochiKit.Base.partial(MochiKit.Async.succeed, 2) + ], someTestArgs + )); + deferredResult.addCallback(function (anAsyncResult) { + var sum; + + sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult); + SimpleTest.is(sum, 5, "the sum of all the returned results should be 5"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (1)") + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'succeedingForkedAndWaitDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('succeedingForkedAndWaitDeferrer_test', someTestArgs); + deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test succeedingForkedAndWaitDeferrer", + [ + MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), + MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), + MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) + ], someTestArgs + )); + deferredResult.addCallback(function (anAsyncResult) { + var sum; + + sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, anAsyncResult); + SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(false, "forkAndJoin should succeed and execution path should NOT go through here (2)") + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'failingForkedDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('Async.test failingForkedDeferred', someTestArgs); + deferredResult.addCallback(Clipperz.Async.forkAndJoin("Async.test failingForkedDeferred", + [ + MochiKit.Async.succeed, + MochiKit.Async.fail + ], someTestArgs + )); + deferredResult.addCallback(function () { + SimpleTest.ok(false, "forkAndJoin should fail, and execution path should NOT go through here"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(true, "forkAndJoin should fail and execution path should go through here") + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'succeedingCollectResultsDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('Async.test succeedingCollectResultsDeferrer', someTestArgs); + deferredResult.addCallback(Clipperz.Async.collectResults('Async.test succeedingCollectResultsDeferrer', { + 'first': MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), + 'second': MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), + 'third': MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) + }, someTestArgs)); + deferredResult.addCallback(function (anAsyncResult) { + var sum; + + sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult)); + SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); + SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3"); + SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2"); + SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7"); + SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'collectResultsWithParameter_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('collectResultsWithParameter_test', someTestArgs); + deferredResult.collectResults({ + 'add_3': MochiKit.Base.partial(MochiKit.Base.operator.add, 3), + 'sub_8': MochiKit.Base.partial(MochiKit.Base.operator.sub, 8), + 'mul_4': MochiKit.Base.partial(MochiKit.Base.operator.mul, 4) + }); + deferredResult.addCallback(function (anAsyncResult) { + SimpleTest.is(anAsyncResult['add_3'], 8, "adding 3 to the passed value (5) returns 8"); + SimpleTest.is(anAsyncResult['sub_8'], 3, "subtracting the passed value (5) to 8 returns 3"); + SimpleTest.is(anAsyncResult['mul_4'], 20, "multiplying the passed value (5) by 4 returns 20"); + SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); + }); + deferredResult.callback(5); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'succeedingCollectResultsDeferrer_alternative_syntax_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('succeedingCollectResultsDeferrer_alternative_syntax_test', someTestArgs); + deferredResult.collectResults({ + 'first': MochiKit.Base.partial(MochiKit.Async.callLater, 2, MochiKit.Async.succeed, 3), + 'second': MochiKit.Base.partial(MochiKit.Async.callLater, 1, MochiKit.Async.succeed, 2), + 'third': MochiKit.Base.partial(MochiKit.Async.callLater, 3, MochiKit.Async.succeed, 7) + }); + deferredResult.addCallback(function (anAsyncResult) { + var sum; + + sum = MochiKit.Iter.reduce(MochiKit.Base.operator.add, MochiKit.Base.values(anAsyncResult)); + SimpleTest.is(sum, 12, "the sum of all the returned results should be 12"); + SimpleTest.is(anAsyncResult['first'], 3, "the result of the 'first' item is 3"); + SimpleTest.is(anAsyncResult['second'], 2, "the result of the 'second' item is 2"); + SimpleTest.is(anAsyncResult['third'], 7, "the result of the 'third' item is 7"); + SimpleTest.is(MochiKit.Base.keys(anAsyncResult).length, 3, "the result has exactly 3 values"); + }); + deferredResult.addErrback(function() { + SimpleTest.ok(false, "collectResults should succeed and execution path should NOT go through here"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'failingCollectResultsDeferrer_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('Async.test failingCollectResultsDeferrer', someTestArgs); + deferredResult.addCallback(Clipperz.Async.collectResults('Async.test failingCollectResultsDeferrer', { + 'succeed': MochiKit.Base.partial(MochiKit.Async.succeed, 3), + 'fail': MochiKit.Base.partial(MochiKit.Async.fail, 2) + }, someTestArgs)); + deferredResult.addCallback(function() { + SimpleTest.ok(false, "collectResults should fail and execution path should NOT go through here"); + }); + deferredResult.addErrback(function (anAsyncResult) { + var result; + + result = anAsyncResult['message']; + SimpleTest.is(MochiKit.Base.keys(result).length, 2, "the result has exactly 2 values"); +//console.log("anAsyncResult", anAsyncResult); + SimpleTest.ok(!(result['succeed'] instanceof Error), "the successful value is actually successful"); + SimpleTest.ok(result['fail'] instanceof Error, "the failed value is actually failed"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'collectResults_withSimpleArrayListOfCalls_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('collectResults_withSimpleArrayListOfCalls_test', someTestArgs); + deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withSimpleArrayListOfCalls_test - collectResults', { + 'path1': [ + MochiKit.Base.partial(MochiKit.Async.succeed, 3) + ], + 'path2': MochiKit.Base.partial(MochiKit.Async.succeed, 2) + }, someTestArgs)); + deferredResult.addCallback(function (anAsyncResult) { + SimpleTest.is(anAsyncResult['path1'], 3, "the result of the first path is 3"); + SimpleTest.is(anAsyncResult['path2'], 2, "the result of the second path is 2"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'collectResults_withArrayListOfCalls_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred('collectResults_withArrayListOfCalls_test', someTestArgs); + deferredResult.addCallback(Clipperz.Async.collectResults('collectResults_withArrayListOfCalls_test - collectResults', { + 'path1': [ + MochiKit.Base.partial(MochiKit.Async.succeed, {key1:'value1', key2:'value2'}), + Clipperz.Base.serializeJSON + ], + 'path2': [ + MochiKit.Base.partial(MochiKit.Async.succeed, {key3:'value3', key4:'value4'}), + Clipperz.Base.serializeJSON + ] + }, someTestArgs)); + deferredResult.addCallback(function (anAsyncResult) { + SimpleTest.is(anAsyncResult['path1'], "{\"key1\":\"value1\",\"key2\":\"value2\"}", "the result of the first path is correct"); + SimpleTest.is(anAsyncResult['path2'], "{\"key3\":\"value3\",\"key4\":\"value4\"}", "the result of the second path is correct"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredSort_test': function (someTestArgs) { + var deferredResult; + var testArray; + + testArray = [ + {key:'key2', label:function () { return MochiKit.Async.succeed('label2')} }, + {key:'key3', label:function () { return MochiKit.Async.succeed('label3')} }, + {key:'key7', label:function () { return MochiKit.Async.succeed('label7')} }, + {key:'key1', label:function () { return MochiKit.Async.succeed('label1')} }, + {key:'key5', label:function () { return MochiKit.Async.succeed('label5')} }, + {key:'key4', label:function () { return MochiKit.Async.succeed('label4')} }, + {key:'key9', label:function () { return MochiKit.Async.succeed('label9')} }, + {key:'key8', label:function () { return MochiKit.Async.succeed('label8')} }, + {key:'key6', label:function () { return MochiKit.Async.succeed('label6')} } + ] + + deferredResult = new Clipperz.Async.Deferred('deferredSort_test', someTestArgs); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aObject, bObject) { + var result; + + result = Clipperz.Async.deferredCompare(MochiKit.Base.compare, aObject.label(), bObject.label()); + + return result; + }); + deferredResult.addCallback(function (aSortedArray) { + SimpleTest.is(aSortedArray.length, testArray.length, "The sorted array should have the same number of objects as the original one"); + SimpleTest.is(aSortedArray[0]['key'], 'key1', "[0] -> key1"); + SimpleTest.is(aSortedArray[1]['key'], 'key2', "[1] -> key2"); + SimpleTest.is(aSortedArray[2]['key'], 'key3', "[2] -> key3"); + SimpleTest.is(aSortedArray[3]['key'], 'key4', "[3] -> key4"); + SimpleTest.is(aSortedArray[4]['key'], 'key5', "[4] -> key5"); + SimpleTest.is(aSortedArray[5]['key'], 'key6', "[5] -> key6"); + SimpleTest.is(aSortedArray[6]['key'], 'key7', "[6] -> key7"); + SimpleTest.is(aSortedArray[7]['key'], 'key8', "[7] -> key8"); + SimpleTest.is(aSortedArray[8]['key'], 'key9', "[8] -> key9"); + }); + deferredResult.callback(testArray); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'callbacks_test': function (someTestArgs) { + return Clipperz.Async.callbacks("callbacks_test", [ + MochiKit.Base.partial(MochiKit.Base.operator.add, 5), + Clipperz.Async.Test.is(15, "Clipperz.Async.callbacks seems to work") + ], someTestArgs, 10); + }, + + //------------------------------------------------------------------------- + + 'deferredAcquireLockTest': function (someTestArgs) { + var deferredLock; + var deferredResult; + var anotherDeferred; + var deferredResults; + + deferredLock = new MochiKit.Async.DeferredLock(); + deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false}); + deferredResult.acquireLock(deferredLock); + deferredResult.addCallback(function () { + SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock'); + }); + + anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false}); + anotherDeferred.acquireLock(deferredLock); + anotherDeferred.addCallback(function () { + SimpleTest.ok(false, 'Did not wait on a locked DeferredLock') + }); + anotherDeferred.addErrback(function (anError) { + SimpleTest.ok(true, 'Did wait on a locked DeferredLock'); + }); + + deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false); + MochiKit.Async.callLater(1, function () { + anotherDeferred.cancel(); + }); + + deferredResult.callback(); + anotherDeferred.callback(); + return deferredResults; + }, + + //------------------------------------------------------------------------- + + 'deferredLockAcquireTest': function (someTestArgs) { + var deferredLock; + var defferedResult; + var anotherDeferred; + var deferredResults; + + deferredLock = new MochiKit.Async.DeferredLock(); + deferredResult = new Clipperz.Async.Deferred("acquireLockTest", {trace:false}); + deferredResult.addMethod(deferredLock, 'acquire'); + deferredResult.addCallback(function () { + SimpleTest.is(true, deferredLock.locked, 'DeferredLock is locked after Clipperz.Async.Deferred.acquireLock'); + }); + + anotherDeferred = new Clipperz.Async.Deferred("acquireLockLockedTest", {trace:false}); + anotherDeferred.addMethod(deferredLock, 'acquire'); + anotherDeferred.addCallback(function () { + SimpleTest.ok(false, 'Did not wait on a locked DeferredLock') + }); + anotherDeferred.addErrback(function (anError) { + SimpleTest.ok(true, 'Did wait on a locked DeferredLock'); + }); + + + deferredResults = new MochiKit.Async.DeferredList([deferredResult, anotherDeferred], false, false, false); + MochiKit.Async.callLater(1, function () { + anotherDeferred.cancel(); + }); + + deferredResult.callback(); + anotherDeferred.callback() + + return deferredResults; + }, + + //------------------------------------------------------------------------- + + 'deferredFilter_test': function (someTestArgs) { + var deferredResult; + var testObjects; + var filterRegExp; + var deferredFilterFunction; + + testObjects = [ + {key: '1', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 1') }, + {key: '2', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 2') }, + {key: '3', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 3') }, + {key: '4', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 4') }, + {key: '5', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 5') }, + {key: '6', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 6') }, + {key: '7', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 7') }, + {key: '8', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 8') }, + {key: '9', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'skip 9') }, + {key:'10', label: MochiKit.Base.partial(MochiKit.Async.succeed, 'hit 10') } + ] + + filterRegExp = new RegExp("hit", "i"); + + deferredFilterFunction = function (aRegExp, anObject) { + return Clipperz.Async.callbacks("deferredFilterFunction", [ + MochiKit.Base.method(anObject, 'label'), + MochiKit.Base.method(aRegExp, 'test'), + function (doesItMatch) { + var result; + + if (doesItMatch) { + result = MochiKit.Async.succeed('match'); + } else { + result = MochiKit.Async.fail('miss'); + } + + return result; + } + ], someTestArgs); + }; + + deferredResult = new Clipperz.Async.Deferred("deferredFilter_test", someTestArgs); + deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.partial(deferredFilterFunction, filterRegExp), testObjects); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult.length, 4, "There are 4 items matching the 'hit' regexp"); + SimpleTest.is(aResult[0]['key'], '2', "The first item to match is the one with key:2"); + SimpleTest.is(aResult[1]['key'], '4', "The first item to match is the one with key:4"); + SimpleTest.is(aResult[2]['key'], '7', "The first item to match is the one with key:7"); + SimpleTest.is(aResult[3]['key'], '10', "The first item to match is the one with key:10"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredFilter_methodcaller_test': function (someTestArgs) { + var deferredResult; + var testObjects; + var filterRegExp; + var deferredFilterFunction; + + testObjects = [ + new testObject('skip 1'), + new testObject('hit 2'), + new testObject('skip 3'), + new testObject('hit 4'), + new testObject('skip 5'), + new testObject('skip 6'), + new testObject('hit 7'), + new testObject('skip 8'), + new testObject('skip 9'), + new testObject('hit 10') + ]; + + deferredResult = new Clipperz.Async.Deferred("deferredFilter_methodcaller_test", someTestArgs); +// deferredResult.addCallback(function () { return testObjects[0]; }); + deferredResult.addCallback(MochiKit.Async.succeed, testObjects[0]); + deferredResult.addCallback(MochiKit.Base.methodcaller('shouldHit')); + deferredResult.addTest(false, "the first element shoud return 'false' to the 'shouldHit' method"); + + deferredResult.addCallback(MochiKit.Async.succeed, testObjects[1]); + deferredResult.addCallback(MochiKit.Base.methodcaller('shouldHit')); + deferredResult.addTest(true, "the second element shoud return 'true' to the 'shouldHit' method"); + + deferredResult.addCallback(MochiKit.Async.succeed, testObjects); + deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('shouldHit')); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult.length, 4, "There are 4 items matching the 'hit' regexp"); + SimpleTest.is(aResult[0]._label, 'hit 2', "The first item to match is the one with key:2"); + SimpleTest.is(aResult[1]._label, 'hit 4', "The first item to match is the one with key:4"); + SimpleTest.is(aResult[2]._label, 'hit 7', "The first item to match is the one with key:7"); + SimpleTest.is(aResult[3]._label, 'hit 10', "The first item to match is the one with key:10"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setItem_test': function (someTestArgs) { + var deferredResult; + var result; + + result = {}; + deferredResult = new Clipperz.Async.Deferred("setItem_test", someTestArgs); + deferredResult.addCallback(MochiKit.Async.succeed, "Value 1"); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'key1'); + deferredResult.addCallback(MochiKit.Async.succeed, "Value 2"); + deferredResult.addCallback(Clipperz.Async.setItem, result, 'key2'); + + deferredResult.addCallback(MochiKit.Base.itemgetter('key1')); + deferredResult.addTest("Value 1", "the value for the 'key1' does match"); + + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(MochiKit.Base.itemgetter('key2')); + deferredResult.addTest("Value 2", "the value for the 'key2' does match"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setItemOnObject_test': function (someTestArgs) { + var deferredResult; + var result; + + result = {}; + + deferredResult = new Clipperz.Async.Deferred("setItemOnObject_test", someTestArgs); + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(Clipperz.Async.setItemOnObject, 'key1', "Value 1"); + deferredResult.addCallback(Clipperz.Async.setItemOnObject, 'key2', "Value 2"); + + deferredResult.addCallback(MochiKit.Base.itemgetter('key1')); + deferredResult.addTest("Value 1", "the value for the 'key1' does match"); + + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(MochiKit.Base.itemgetter('key2')); + deferredResult.addTest("Value 2", "the value for the 'key2' does match"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'setDeferredItemOnObject_test': function (someTestArgs) { + var deferredResult; + var result; + + result = {}; + + deferredResult = new Clipperz.Async.Deferred("setDeferredItemOnObject_test", someTestArgs); + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(Clipperz.Async.setDeferredItemOnObject, 'key1', MochiKit.Base.partial(MochiKit.Async.succeed, "Value 1")); + deferredResult.addCallback(Clipperz.Async.setDeferredItemOnObject, 'key2', MochiKit.Base.partial(MochiKit.Async.succeed, "Value 2")); + + deferredResult.addCallback(MochiKit.Base.itemgetter('key1')); + deferredResult.addTest("Value 1", "the value for the 'key1' does match"); + + deferredResult.addCallback(MochiKit.Async.succeed, result); + deferredResult.addCallback(MochiKit.Base.itemgetter('key2')); + deferredResult.addTest("Value 2", "the value for the 'key2' does match"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addIf_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("addIf_test", someTestArgs); + + deferredResult.addCallback(MochiKit.Async.succeed, true); + deferredResult.addIf([ + MochiKit.Base.partial(SimpleTest.ok, true, "when a true value is passed, the 'then' branch is executed") + ], [ + MochiKit.Base.partial(SimpleTest.ok, false, "when a true value is passed, the 'else' branch should NOT be executed") + ]); + + deferredResult.addCallback(MochiKit.Async.succeed, false); + deferredResult.addIf([ + MochiKit.Base.partial(SimpleTest.ok, false, "when a false value is passed, the 'then' branch should NOT be executed") + ], [ + MochiKit.Base.partial(SimpleTest.ok, true, "when a false value is passed, the 'else' branch is executed") + ]); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addMethod_test': function (someTestArgs) { + var deferredResult; + var testObjectInstance; + var testObjectInstance_2; + var label; + var testObjectInstanceGetter; + + label = "Test - Label"; + testObjectInstance = new testObject(label); + testObjectInstance_2 = new testObject(label + label); + testObjectInstance.setSibling(testObjectInstance_2); + + testObjectInstanceGetter = function () { + return testObjectInstance; + } + + deferredResult = new Clipperz.Async.Deferred("addMethod_test", someTestArgs); + deferredResult.addMethod(testObjectInstance, 'label'); + deferredResult.addTest(label, "the addMethod seems to work"); + + deferredResult.addMethod(testObjectInstanceGetter(), 'label'); + deferredResult.addTest(label, "the addMethod seems to work"); + + deferredResult.addMethod(testObjectInstance.sibling(), 'label'); + deferredResult.addTest(label+label, "the addMethod seems to work"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'callbacksWithErrors_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("callbacksWithErrors_test", someTestArgs); + deferredResult.addCallback(MochiKit.Base.partial(Clipperz.Async.callbacks, "callbacksWithErrors_test - callbacks", [ + function () { return 10; }, + function (aValue) { pippo = pluto + aValue; }, + function (aValue) { SimpleTest.ok(false, "this code should never be executed"); return aValue; } + ], {trace:someTestArgs})); + deferredResult.addCallback(SimpleTest.ok, false, "the inner code should raise an exception and exit through the error chain"); + deferredResult.addErrback(SimpleTest.ok, true, "the inner code should raise an exception and exit through the error chain"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deferredVars_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("deferredVars_test", someTestArgs); + deferredResult.addCallback(MochiKit.Async.succeed, "test string"); + deferredResult.setValue('testKey'); + deferredResult.addCallback(MochiKit.Async.succeed, "another string"); + deferredResult.getValue('testKey'); + deferredResult.addTest("test string", "The right string has been fetched"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.Async", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/Base.html b/frontend/gamma/tests/tests/Clipperz/Base.html new file mode 100644 index 0000000..6b29417 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Base.html @@ -0,0 +1,55 @@ + + + + + Clipperz.Base - TEST + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Base.test.js b/frontend/gamma/tests/tests/Clipperz/Base.test.js new file mode 100644 index 0000000..e5c7caf --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Base.test.js @@ -0,0 +1,367 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + + +//============================================================================= + +testEvalJSON = function(aString, shouldFail, aDescription) { + var result; + + if (shouldFail == true) { + try { + result = Clipperz.Base.evalJSON(aString); + is(true, false, aDescription + ": vulnerability not caught"); +//console.log(result); + } catch(exception) { + is(true, true, aDescription + ": vulnerability correctly caught"); + } + } else { + try { + result = Clipperz.Base.evalJSON(aString); + is(true, true, aDescription + ": configuration correctly checked"); + } catch(exception) { + is(true, false, aDescription + ": configuration wrongly caught as malicious"); +// console.log(exception); + } + } + + return result; +} + +//============================================================================= + +var tests = { + + '001_test': function () { + var stringToSplit; + var splittedString; + + stringToSplit = "stringToSplit"; + splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 2); + is(splittedString.length, 7); + is(splittedString[0], 'st'); + is(splittedString[1], 'ri'); + is(splittedString[2], 'ng'); + is(splittedString[3], 'To'); + is(splittedString[4], 'Sp'); + is(splittedString[5], 'li'); + is(splittedString[6], 't', "test that should pass"); + + stringToSplit = "stringToSplit"; + splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20); + is(splittedString.length, 1); + is(splittedString[0], 'stringToSplit'); + + stringToSplit = null; + splittedString = Clipperz.Base.splitStringAtFixedTokenSize(stringToSplit, 20); + is(splittedString.length, 0); + }, + + //------------------------------------------------------------------------- + + '002_test': function () { + var anObject; + + anObject = "String"; + is(Clipperz.Base.objectType(anObject), 'string', "test on strings (1)"); + anObject = new String("String"); + is(Clipperz.Base.objectType(anObject), 'string', "test on strings (2)"); + + anObject = 120; + is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (1)"); + anObject = new Number(120); + is(Clipperz.Base.objectType(anObject), 'number', "test on numbers (2)"); + + anObject = true; + is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (1)"); + anObject = new Boolean(true); + is(Clipperz.Base.objectType(anObject), 'boolean', "test on booleans (2)"); + + anObject = new Date; + is(Clipperz.Base.objectType(anObject), 'date', "test on dates"); + + anObject = new Error("test"); + is(Clipperz.Base.objectType(anObject), 'error', "test on errors"); + + anObject = function() {}; + is(Clipperz.Base.objectType(anObject), 'function', "test on functions"); + + anObject = new Object(); + is(Clipperz.Base.objectType(anObject), 'object', "test on objects"); + + + anObject = [1, 2, 3]; + is(Clipperz.Base.objectType(anObject), 'array', "test on arrays"); + }, + + //------------------------------------------------------------------------- + + '003_test': function () { + var original, clone; + + original = { + a: "a", + b: "b" + }; + + clone = Clipperz.Base.deepClone(original); + is(MochiKit.Base.compare(original, clone), 0, "simple cloning return two equal objects"); + + clone.c = "c"; + is(MochiKit.Base.compare(original, clone), -1, "changing an object leave the original object unchanged"); + + original = { + a: "a", + b: "b", + nested: { + a1: "a1", + b1: "b1" + } + }; + + clone = Clipperz.Base.deepClone(original); + is(MochiKit.Base.compare(original, clone), 0, "cloning of an object with nested values return two equal objects"); + + clone.nested.c1 = "c1"; + is(MochiKit.Base.compare(original, clone), -1, "changing a nested value leave the original object unchanged"); + }, + + //------------------------------------------------------------------------- + + '004_test': function () { + var jsonString; + + jsonString = '{"page": {"title": "Example Attack"},"form": { "attributes": { "action": "javascript:opener.document.body.innerHTML = \'hacked!\';close();", "style": "-moz-binding:url(\'http://ha.ckers.org/xssmoz.xml#xss\')", "method": null }, "inputs": [{"type": "text", "name": "username", "value": ""}, {"type": "password", "name": "password", "value": ""}]},"version": "0.2.3" }'; + testEvalJSON(jsonString, false, ""); + + // jsonString = '{"0":{"label":" + + + + + + + + + + + + + + + + + + + + + + + +
+
+	
+	
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js new file mode 100644 index 0000000..ef2660e --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/ByteArray.test.js @@ -0,0 +1,893 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'core_tests': function (someTestArgs) { +// var deferredResult; + +// deferredResult = new Clipperz.Async.Deferred("core_tests", someTestArgs); +// deferredResult.addCallback(function() { + var byteArray; + + byteArray = new Clipperz.ByteArray(); + + try { + byteArray.checkByteValue(512); + is(false, true, "a value greater that a byte (0x200) should have raised an exception - NO Exception"); + } catch(e) { +// is( e.name, +// "Clipperz.ByteArray.exception.InvalidValue", +// "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") + ok( /Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), + "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") + }; + +// }); +// deferredResult.callback(); + +// return deferredResult; + + }, + + //------------------------------------------------------------------------- + + 'basic_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var byteArray2; + var byteArrayIterator; + var nextBlock; + + byteArray = new Clipperz.ByteArray(); + is(byteArray.length(), 0, "before adding any element the length is 0"); + byteArray.appendByte(10); + is(byteArray.length(), 1, "adding a single byte the length == 1"); + is(byteArray.byteAtIndex(0), 10, "the first element is correct"); + + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.constructor, Array, "ByteArrayIterator.nextBlock returns an array of byte values"); + is(nextBlock.length, 1, "as the block size is 8bit, the returned array has only one element"); + is(nextBlock[0], 10, "the element of the returned block is correct"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "after the last element, the nextBlock returns null"); + + byteArray = new Clipperz.ByteArray(); + byteArray.appendBytes(10, 20, 45, 38); + is(byteArray.length(), 4, "Appending more bytes, returns the right length"); + is(byteArray.byteAtIndex(0), 10, "and all the elements are right [0]"); + is(byteArray.byteAtIndex(1), 20, "and all the elements are right [1]"); + is(byteArray.byteAtIndex(2), 45, "and all the elements are right [2]"); + is(byteArray.byteAtIndex(3), 38, "and all the elements are right [3]"); + + byteArray2 = new Clipperz.ByteArray(); + byteArray2.appendBytes([10, 20, 45, 38]); + is(byteArray.equals(byteArray2), true, "equals method tested with a byteArray created with the same values"); + + byteArray2 = new Clipperz.ByteArray(); + byteArray2.appendBytes([20, 11, 3, 22]); + is(byteArray.equals(byteArray2), false, "equals method tested with a byteArray created with different values"); + + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(8/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 1, "the size of the block returned by the byteArrayIterator match with the configured blockedSize"); + is(nextBlock[0], 10, "the values returned by nextBlock are right [1]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 20, "the values returned by nextBlock are right [2]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 45, "the values returned by nextBlock are right [3]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 38, "the values returned by nextBlock are right [4]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "after the last block the nextBlock method returns null"); + + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 2, "on the same data, using a different block size, returns the right length"); + is(nextBlock[0], 10, "and also the data are fine [1][0]"); + is(nextBlock[1], 20, "and also the data are fine [1][1]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 2, "also the second block size is right"); + is(nextBlock[0], 45, "and also the data are fine [2][0]"); + is(nextBlock[1], 38, "and also the data are fine [2][1]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "even with a bigger blockSize, at the end the returned value is null"); + + byteArray = new Clipperz.ByteArray(11,22,33,44,55,66,77,88,99); + is(byteArray.length(), 9, ""); + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(16/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + nextBlock = byteArrayIterator.nextBlock(); + nextBlock = byteArrayIterator.nextBlock(); + nextBlock = byteArrayIterator.nextBlock(); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 2, "the last block of an odd byte array has always the same size"); + is(nextBlock[0], 99, "the last element is returned"); + is(nextBlock[1], 0, "and a 0 is return for the extra values"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned"); + + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(32/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 11, "32 bit blockSize [1][0]"); + is(nextBlock[1], 22, "32 bit blockSize [1][1]"); + is(nextBlock[2], 33, "32 bit blockSize [1][2]"); + is(nextBlock[3], 44, "32 bit blockSize [1][3]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock[0], 55, "32 bit blockSize [2][0]"); + is(nextBlock[1], 66, "32 bit blockSize [2][1]"); + is(nextBlock[2], 77, "32 bit blockSize [2][2]"); + is(nextBlock[3], 88, "32 bit blockSize [2][3]"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 4, "the last block of an odd byte array has always the same size"); + is(nextBlock[0], 99, "the last element is returned (2)"); + is(nextBlock[1], 0, "and a 0 is return for the extra values (2.1)"); + is(nextBlock[2], 0, "and a 0 is return for the extra values (2.2)"); + is(nextBlock[3], 0, "and a 0 is return for the extra values (2.3)"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock, null, "even with odd blockSize, after returning all the values, null is returned (2)"); + + byteArray = new Clipperz.ByteArray([11,22,33,44,55,66,77,88,99,100, 111, 122, 133, 144, 155, 166, 177]); + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:true}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 16, "using a blockSize of 128 bit, the nextBlock return a 16 elements array"); + + byteArray = new Clipperz.ByteArray(); + try { + byteArray.appendByte(512); + is(false, true, "appending a value greater that a byte (0x200) should have raised an exception - NO Exception"); + } catch(e) { +// is( e.name, +// "Clipperz.ByteArray.exception.InvalidValue", +// "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") + ok( /Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), + "appending a value greater that a byte (0x200) should have raised an exception - EXCEPTION HANDLER") + }; + + try { + byteArray.appendByte(256); + is(false, true, "appending a value greater that a byte (0x100) should have raised an exception - NO Exception"); + } catch(e) { +// is( e.name, +// "Clipperz.ByteArray.exception.InvalidValue", +// "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER") + ok( /Clipperz\.ByteArray\.exception\.InvalidValue.*/.test(e.name), + "appending a value greater that a byte (0x100) should have raised an exception - EXCEPTION HANDLER") + }; + + byteArray.appendByte(255); + is(byteArray.length(), 1, "appending a value that feets a single byte does not raise any exception"); + + byteArray = new Clipperz.ByteArray(10, 20, 30, 40, 50); + byteArray2 = new Clipperz.ByteArray("0x0a141e2832"); + is(byteArray.equals(byteArray2), true, "the hex constructor works fine"); + + byteArray2 = byteArray.clone(); + is(byteArray.equals(byteArray2), true, "the clone method works fine"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'compare_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("compare_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray1; + var byteArray2; + var result; + + byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + byteArray2 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + result = byteArray1.compare(byteArray2); + is(result, 0, "equal compare"); + + byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + byteArray2 = new Clipperz.ByteArray("0x05", 16); + result = byteArray1.compare(byteArray2); + is(result, 1, "'OxXXXXXXX'.compare('0x05')"); + result = byteArray2.compare(byteArray1); + is(result, -1, "'0x05'.compare('OxXXXXXXX')"); + + byteArray1 = new Clipperz.ByteArray("0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", 16); + byteArray2 = new Clipperz.ByteArray("0xff", 16); + result = byteArray1.compare(byteArray2); + is(result, 1, "'OxXXXXXXX'.compare('0xff')"); + result = byteArray2.compare(byteArray1); + is(result, -1, "'0xff'.compare('OxXXXXXXX')"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'shiftLeft_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("shiftLeft_tests", someTestArgs); + deferredResult.addCallback(function() { + + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'nextBlockArray_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("nextBlockArray_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var byteArrayIterator; + var nextBlock; + + byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false}); + nextBlock = byteArrayIterator.nextBlockArray(); + is(nextBlock.toHexString(), "0x8cf53d90077df9a043bf8d10b470b144", "nextBlockArray first iteration"); + nextBlock = byteArrayIterator.nextBlockArray(); + is(nextBlock.toHexString(), "0x784411c93a4d504556834dae3ea4a5bb", "nextBlockArray second iteration"); + + byteArray = new Clipperz.ByteArray("0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb"); + byteArrayIterator = new Clipperz.ByteArrayIterator({byteArray:byteArray, blockSize:(128/8), finalPadding:false}); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 16, "nextBlock first iteration length"); + nextBlock = byteArrayIterator.nextBlock(); + is(nextBlock.length, 16, "nextBlock second iteration length"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'xor_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("xor_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var byteArray2; + + byteArray = new Clipperz.ByteArray("0x55555555555555555555555555555555"); + byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); + is(byteArray.xorMergeWithBlock(byteArray2).toHexString(), "0x55aa555555aa555555aa555555aa5555", "the xorMergeWithBlock method works fine"); + + byteArray = new Clipperz.ByteArray("0x555555555555555555"); + byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); + is(byteArray.xorMergeWithBlock(byteArray2, 'left', 'truncate').toHexString(), "0x55aa555555aa555555", "the xorMergeWithBlock (left, truncate) method works fine"); + + byteArray = new Clipperz.ByteArray("0x555555555555555555"); + byteArray2 = new Clipperz.ByteArray("0x00ff000000ff000000ff000000ff0000"); + is(byteArray.xorMergeWithBlock(byteArray2, 'right', 'truncate').toHexString(), "0x5555aa555555aa5555", "the xorMergeWithBlock (right, truncate) method works fine"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'increment_tests': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("increment_tests", someTestArgs); + deferredResult.addCallback(function() { + var byteArray; + var number; + var i,c; + + number = new Clipperz.Crypto.BigInt("55555555555555555555555555555555", 16); + byteArray = new Clipperz.ByteArray("0x" + number.asString(16)); + c = 2048; + for (i=0; i. + +--> + + + + Clipperz.Crypto.AES_v3 - TEST + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html new file mode 100644 index 0000000..0d1cf07 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/AES.performance.html @@ -0,0 +1,344 @@ + + + + + Clipperz.Crypto.AES_performance - TEST + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html new file mode 100644 index 0000000..86fc49a --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Base.html @@ -0,0 +1,428 @@ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html new file mode 100644 index 0000000..bdb0cbc --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/BigInt.html @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html new file mode 100644 index 0000000..ba98167 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.B283.deferred.html @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html new file mode 100644 index 0000000..3d7efaa --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.B283.html @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html new file mode 100644 index 0000000..6bddb26 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.FiniteField.html @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html new file mode 100644 index 0000000..885bcc4 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.BinaryField.Value.html @@ -0,0 +1,496 @@ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html new file mode 100644 index 0000000..b53a9a1 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/ECC.K283.deferred.html @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html new file mode 100644 index 0000000..1342349 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.html @@ -0,0 +1,70 @@ + + + + + Clipperz.Crypto.JSCrypto_vs_Clipperz - tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+	
+	
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js new file mode 100644 index 0000000..7dc688c --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/JSCrypto_vs_Clipperz.test.js @@ -0,0 +1,418 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +//function logElapsedTime(aDescription, aStartTime, anEndTime) { +// MochiKit.Logging.logDebug(aDescription + " - took " + (anEndTime - aStartTime) + "ms"); +// SimpleTest.ok(true, aDescription + " - took " + (anEndTime - aStartTime) + "ms"); +//} + +var asciiTestString = longAsciiText; +//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString; +//asciiTestString = asciiTestString + asciiTestString; + +var isoLatin1TestString = longIsoLatin1Text; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString + isoLatin1TestString; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString; +//isoLatin1TestString = isoLatin1TestString + isoLatin1TestString; + +var utf8TestString = longUtf8Text; +//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString; +//utf8TestString = utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString + utf8TestString; +//utf8TestString = utf8TestString + utf8TestString; +//utf8TestString = utf8TestString + utf8TestString; + +var times = { + 'Clipperz': {}, + 'JSCrypto': {} +}; + +function appendResults (aDescription, aTimer) { + MochiKit.DOM.appendChildNodes(MochiKit.DOM.getElement('timerTBODY'), + MochiKit.DOM.TR(null, + MochiKit.DOM.TH({align:'left'}, aDescription), + MochiKit.DOM.TH(null, aTimer['ascii']['encrypt'] + ' - ' + aTimer['ascii']['decrypt'])//, +// MochiKit.DOM.TH(null, aTimer['isoLatin1']['encrypt'] + ' - ' + aTimer['isoLatin1']['decrypt']), +// MochiKit.DOM.TH(null, aTimer['utf8']['encrypt'] + ' - ' + aTimer['utf8']['decrypt']) + ) + ); + +} + +//============================================================================= + +function timeRegularFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey) { + var start; + var end; + var encryptTime; + var decryptTime; + var ciphertext; + var plaintext; + + + start = new Date(); + ciphertext = anEncryptFunction('trustno1', aString); + end = new Date(); + encryptTime = end - start; + + start = new Date(); + plaintext = aDecryptFunction('trustno1', ciphertext); + end = new Date(); + decryptTime = end - start; + aTimer[aKey] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; + SimpleTest.is(aString, plaintext, aDescription); +} +/* +function timeRegularFunction (anEncryptFunction, aDecryptFunction, aTimer) { + var start; + var end; + var encryptTime; + var decryptTime; + var ciphertext; + var plaintext; + + + start = new Date(); + ciphertext = anEncryptFunction('trustno1', asciiTestString); + end = new Date(); + encryptTime = end - start; + + start = new Date(); + plaintext = aDecryptFunction('trustno1', ciphertext); + end = new Date(); + decryptTime = end - start; + aTimer['ascii'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; + SimpleTest.is(asciiTestString, plaintext, "Encrypt/decrypt the ASCII text"); + + + start = new Date(); + ciphertext = anEncryptFunction('trustno1', isoLatin1TestString); + end = new Date(); + encryptTime = end - start; + + start = new Date(); + plaintext = aDecryptFunction('trustno1', ciphertext); + end = new Date(); + decryptTime = end - start; + aTimer['isoLatin1'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; + SimpleTest.is(isoLatin1TestString, plaintext, "Encrypt/decrypt the ISO-Latin 1 text"); + + + start = new Date(); + ciphertext = anEncryptFunction('trustno1', utf8TestString); + end = new Date(); + encryptTime = end - start; + + start = new Date(); + plaintext = aDecryptFunction('trustno1', ciphertext); + end = new Date(); + decryptTime = end - start; + aTimer['utf8'] = { 'encrypt': encryptTime, 'decrypt': decryptTime }; + SimpleTest.is(utf8TestString, plaintext, "Encrypt/decrypt the UTF-8 text"); +} +*/ +function timeDeferredFunction (aDescription, aString, anEncryptFunction, aDecryptFunction, aTimer, aKey, someTestArgs) { + var start; + var end; + + var deferredResult; + + aTimer[aKey] = {}; + + deferredResult = new Clipperz.Async.Deferred("timeDeferredFunction", someTestArgs); + deferredResult.addCallback(function (aValue) { start = new Date(); return aValue}); + deferredResult.addCallback(anEncryptFunction, 'trustno1', aString); + deferredResult.addCallback(function (aValue) { + end = new Date(); + aTimer[aKey]['encrypt'] = end-start; + return aValue; + }); + deferredResult.addCallback(function (aValue) { start = new Date(); return aValue}); + deferredResult.addCallback(aDecryptFunction, 'trustno1'); + deferredResult.addCallback(function (aValue) { + end = new Date(); + aTimer[aKey]['decrypt'] = end-start; + return aValue; + }); + deferredResult.addCallback(function (aValue) { + SimpleTest.is(aString, aValue, aDescription); + }); + + deferredResult.callback(); + + return deferredResult; +} + +//============================================================================= + +function encryptUsingJSCrypto (aKey, aValue) { + var salt; + var key; + var cipher; + var iv; + var plaintext; + var ciphertext; + var tag; + var adata; + + salt = [1,2,3,4,5,6,7,8]; + key = generateKey(aKey, salt); + + cipher = new aes(key, CCM); + iv = Random.random_words(4); + + plaintext = aValue; + ciphertext = []; + tag = []; + adata = ""; + + cipher.encrypt(iv, plaintext, ciphertext, adata, tag); + + return ciphertext; +} + +//----------------------------------------------------------------------------- + +function decryptUsingJSCrypto (aKey, aValue) { + var salt; + var key; + var cipher; + var ciphertext; + var plaintext; + var tag; + var adata; + + salt = [1,2,3,4,5,6,7,8]; + key = generateKey(aKey, salt); + tag = []; + adata = ""; + + cipher = new aes(key, CCM); + ciphertext = aValue; + plaintext = cipher.decrypt(ciphertext, adata, tag); + + return plaintext; +} + +//============================================================================= + +function encryptUsingClipperz (aKey, aValue) { + var key; + var value; + var data; + var encryptedData; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = aValue; + data = new Clipperz.ByteArray(value); + encryptedData = Clipperz.Crypto.AES.encrypt(key, data); + return encryptedData.toBase64String(); +} + +//----------------------------------------------------------------------------- + +function decryptUsingClipperz (aKey, aValue) { + var key; + var 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).asString(); + + return decryptedData; +} + +//============================================================================= + +function encryptUsingClipperzAndJSON (aKey, aValue) { + var key; + var value; + var data; + 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); + return encryptedData.toBase64String(); +} + +//----------------------------------------------------------------------------- + +function decryptUsingClipperzAndJSON (aKey, aValue) { + var key; + var 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).asString(); + + return Clipperz.Base.evalJSON(decryptedData); +} + +//============================================================================= + +function deferredEncryptUsingClipperz (aKey, aValue) { + var deferredResult; + var key; + var data; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + data = new Clipperz.ByteArray(aValue); + + deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredEncrypt", {trace:false}); + deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data); + deferredResult.addCallback(function(aResult) { + return aResult.toBase64String(); + }) + deferredResult.callback(); + + return deferredResult; +} + +//----------------------------------------------------------------------------- + +function deferredDecryptUsingClipperz (aKey, aValue) { + var key, value; + + key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey)); + value = new Clipperz.ByteArray().appendBase64String(aValue); + + deferredResult = new Clipperz.Async.Deferred("Clipperz.deferredDecrypt", {trace:false}); + deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value); + deferredResult.addCallback(function(aResult) { + return aResult.asString(); + }); + deferredResult.callback(); + + return deferredResult; +} + +//============================================================================= + +var tests = { + + //------------------------------------------------------------------------- + + 'encryptMultipleStringsUsingClipperzFunctions': function (someTestArgs) { +// timeRegularFunction(encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['Regular']); + times['Clipperz']['NO JSON'] = {}; + + timeRegularFunction("Clipperz - NO JSON - Ascii", asciiTestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'ascii'); + timeRegularFunction("Clipperz - NO JSON - ISO Latin 1", isoLatin1TestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'isoLatin1'); + timeRegularFunction("Clipperz - NO JSON - UTF-8", utf8TestString, encryptUsingClipperz, decryptUsingClipperz, times['Clipperz']['NO JSON'], 'utf8'); + + appendResults("Clipperz - NO JSON", times['Clipperz']['NO JSON']); + }, + + //------------------------------------------------------------------------- + + 'encryptMultipleStringsUsingClipperzAndJSONFunctions': function (someTestArgs) { +// timeRegularFunction(encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON']); + times['Clipperz']['JSON'] = {}; + + timeRegularFunction("Clipperz - JSON - Ascii", asciiTestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'ascii'); + timeRegularFunction("Clipperz - JSON - ISO Latin 1", isoLatin1TestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'isoLatin1'); + timeRegularFunction("Clipperz - JSON - UTF-8", utf8TestString, encryptUsingClipperzAndJSON, decryptUsingClipperzAndJSON, times['Clipperz']['JSON'], 'utf8'); + + appendResults("Clipperz - JSON", times['Clipperz']['JSON']); + }, + + //------------------------------------------------------------------------- + + 'encryptMultipleStringsUsingClipperzDeferredFunctions': function (someTestArgs) { + times['Clipperz']['Deferred'] = {}; + times['Clipperz']['Deferred [NO JSON]'] = {}; + + return Clipperz.Async.callbacks("encryptMultipleStringsUsingClipperzDeferredFunctions", [ + MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'ascii', someTestArgs), +// MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'isoLatin1', someTestArgs), +// MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, deferredEncryptUsingClipperz, deferredDecryptUsingClipperz, times['Clipperz']['Deferred [NO JSON]'], 'utf8', someTestArgs), + + MochiKit.Base.partial(appendResults, "Clipperz - deferred [NO JSON]", times['Clipperz']['Deferred [NO JSON]']), + + MochiKit.Base.partial(timeDeferredFunction, "Deferred Ascii", asciiTestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'ascii', someTestArgs), +// MochiKit.Base.partial(timeDeferredFunction, "Deferred IsoLatin1", isoLatin1TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'isoLatin1', someTestArgs), +// MochiKit.Base.partial(timeDeferredFunction, "Deferred UTF-8", utf8TestString, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredEncrypt, Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].deferredDecrypt, times['Clipperz']['Deferred'], 'utf8', someTestArgs), + + MochiKit.Base.partial(appendResults, "Clipperz - PM", times['Clipperz']['Deferred']) + ], someTestArgs); + }, + + //------------------------------------------------------------------------- + + 'encryptMultipleStringsUsingJSCryptoFunctions': function (someTestArgs) { + timeRegularFunction("JSCrypto - Ascii", asciiTestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'ascii'); + timeRegularFunction("JSCrypto - ISO Latin 1", isoLatin1TestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'isoLatin1'); + timeRegularFunction("JSCrypto - UTF-8", utf8TestString, encryptUsingJSCrypto, decryptUsingJSCrypto, times['JSCrypto'], 'utf8'); + + appendResults("JSCrypto", times['JSCrypto']); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.waitForExplicitFinish(); +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Random.set_default_paranoia(0); + +//Random.addEventListener("seeded", MochiKit.Base.partial(SimpleTest.runDeferredTests, "Clipperz.Crypto.JSCrypto_vs_Clipperz", tests, {trace:false})); +//Random.addEventListener("seeded", function () { console.log("SEEDED!")}); + + +MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, + MochiKit.DOM.TABLE({border:'1', cellpadding:'4', cellspacing:'0'}, + MochiKit.DOM.THEAD(), + MochiKit.DOM.TBODY({id:'timerTBODY'}, + MochiKit.DOM.TR(null, + MochiKit.DOM.TH(null, "algorithm"), + MochiKit.DOM.TH(null, "ascii [" + asciiTestString.length + "]"), + MochiKit.DOM.TH(null, "ISO Latin 1 [" + isoLatin1TestString.length * 2 + "]"), + MochiKit.DOM.TH(null, "UTF 8 [" + utf8TestString.length * 3 + "]") + ) + ), + MochiKit.DOM.TFOOT() + )//, +// MochiKit.DOM.H4(null, "AES chunkSize: " + Clipperz.Crypto.AES.DeferredExecution.chunkSize), +// MochiKit.DOM.H4(null, "AES pauseTime: " + Clipperz.Crypto.AES.DeferredExecution.pauseTime) +); + + +SimpleTest.runDeferredTests("Clipperz.Crypto.JSCrypto_vs_Clipperz", tests, {trace:false}); \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html new file mode 100644 index 0000000..7ffd691 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/PRNG.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html new file mode 100644 index 0000000..468a987 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/RSA.html @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html new file mode 100644 index 0000000..1c88213 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.html @@ -0,0 +1,175 @@ + + + + + Clipperz.Crypto.SHA - TEST + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js new file mode 100644 index 0000000..c9f1f3b --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SHA.test.js @@ -0,0 +1,84 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +var testSHA = function (aValue, anExpectedResult) { + var byteArrayValue; + + byteArrayValue = new Clipperz.ByteArray(aValue); + hash = Clipperz.Crypto.SHA.sha256(byteArrayValue); + is(hash.toHexString(), anExpectedResult, "sha256(' " + byteArrayValue.toHexString() + "')"); + +} + + +var tests = { + + 'basic_tests': function (someTestArgs) { + testSHA('', '0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); + testSHA('0xbd', '0x68325720aabd7c82f30f554b313d0570c95accbb7dc4b5aae11204c08ffe732b'); + testSHA('0x5fd4', '0x7c4fbf484498d21b487b9d61de8914b2eadaf2698712936d47c3ada2558f6788'); + testSHA('0xc98c8e55', '0x7abc22c0ae5af26ce93dbb94433a0e0b2e119d014f8e7f65bd56c61ccccd9504'); + testSHA('0x0df1cd526b5a4edd', '0x47f527210d6e8f940b5082fec01b7305908fa2b49ea3ae597c19a3986097153c'); + testSHA('0xfdf4700984ee11b70af1880d0e0fefd4', '0xb01ae16eed3b4a770f127b98469ba26fe3d8e9f59d8a2983214afe6cff0e6b6c'); + testSHA('0x8cf53d90077df9a043bf8d10b470b144784411c93a4d504556834dae3ea4a5bb', '0x56059e8cb3c2978b198208bf5ca1e1ea5659b737a506324b7cec75b5ebaf057d'); + testSHA('0xeebcf5cd6b12c90db64ff71a0e08ccd956e170a50dad769480d6b1fb3eff4934cde90f9e9b930ee637a66285c10f4e8a', '0xc117b9dce689c399ec99008788cd5d24d8396fab7d96315c4f3fe6d56da63bb3'); + testSHA('0x3592ecfd1eac618fd390e7a9c24b656532509367c21a0eac1212ac83c0b20cd896eb72b801c4d212c5452bbbf09317b50c5c9fb1997553d2bbc29bb42f5748ad', '0x105a60865830ac3a371d3843324d4bb5fa8ec0e02ddaa389ad8da4f10215c454'); + + }, + + //------------------------------------------------------------------------- + + 'aldo_cortesi_tests': function (someTestArgs) { + testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '0xa3f01b6939256127582ac8ae9fb47a382a244680806a3f613a118851c1ca1d47'); + testSHA('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', '0xb35439a4ac6f0948b6d6f9e3c6af0f5f590ce20f1bde7090ef7970686ec6738a'); + testSHA('0x79', '0xa1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa'); + testSHA('0x80', '0x76be8b528d0075f7aae98d6fa57a6d3c83ae480a8469e668d7b0af968995ac71'); + }, + + //------------------------------------------------------------------------- + + 'longTextPerformance_test': function (someTestArgs) { + var longText; + var startTime; + var endTime; + + longText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit. Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus. Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est. Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit. Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo."; + startTime = new Date(); + testSHA(longText, '0xf6fac13c06784e0fbc61a3d25c41c9984840a8b617a2beb57cf6fa3e5e4a8949'); + endTime = new Date(); + + is((endTime - startTime) < 100, true, "Long text hash performance (" + (endTime - startTime) + ")"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +} + +//============================================================================= + +SimpleTest.runDeferredTests("Clipperz.Crypto.SHA", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html new file mode 100644 index 0000000..63278c4 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/SRP.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html new file mode 100644 index 0000000..63f7610 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/Usage.html @@ -0,0 +1,122 @@ + + + + + Clipperz.Crypto.Usage - TEST + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/index.html b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html new file mode 100644 index 0000000..67487ac --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/index.html @@ -0,0 +1,58 @@ + + + + + Clipperz.Crypto.* - tests + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js new file mode 100644 index 0000000..e9db091 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Crypto/jscrypto.js @@ -0,0 +1,1577 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +/* jsCrypto +Core AES + +Emily Stark (estark@stanford.edu) +Mike Hamburg (mhamburg@stanford.edu) +Dan Boneh (dabo@cs.stanford.edu) + +Symmetric AES in Javascript using precomputed lookup tables for round transformations rather for speed improvements +and code size reduction. Provides authenticated encryption in OCB and CCM modes. +Parts of this code are based on the OpenSSL implementation of AES: http://www.openssl.org + +Public domain, 2009. + +*/ + + +// CCM mode is the default +var CCM = 1, OCB = 2; + +/* aes object constructor. Takes as arguments: +- 16-byte key, or an array of 4 32-bit words +- Optionally specify a mode (aes.OCB or aes.CCM). Defaults to CCM +- Optionally specify a MAC tag length for integrity. Defaults to 16 bytes +*/ +function aes(key, mode, Tlen) { + // initialize objects for CCM and OCB modes + this._CCM = new cipherCCM(this); + this._OCB = new cipherOCB(this); + + this._decryptScheduled = false; + + if (mode) this._mode = mode; + else this._mode = OCB; + + // AES round constants + this._RCON = [ + [0x00, 0x00, 0x00, 0x00], + [0x01, 0x00, 0x00, 0x00], + [0x02, 0x00, 0x00, 0x00], + [0x04, 0x00, 0x00, 0x00], + [0x08, 0x00, 0x00, 0x00], + [0x10, 0x00, 0x00, 0x00], + [0x20, 0x00, 0x00, 0x00], + [0x40, 0x00, 0x00, 0x00], + [0x80, 0x00, 0x00, 0x00], + [0x1b, 0x00, 0x00, 0x00], + [0x36, 0x00, 0x00, 0x00] + ]; + + this._key_len = 16; + if (key.length == 4) { + this._key = []; + aes.wordsToBytes(key, this._key); + } + else + this._key = key; + + if (Tlen) this._Tlen = Tlen; + else this._Tlen = 16; // tag length in bytes + + this._nr = 10; + + // initialize tables that will be precomputed + this._SBOX = []; + this._INV_SBOX = []; + this._T = new Array(4); + this._Tin = new Array(4); + for (var i=0; i < 4; i++) { + this._T[i] = []; + this._Tin[i] = []; + } + + this._precompute(); + this.scheduleEncrypt(); + + // initialize encryption and decryption buffers + this._ctBuffer = []; + this._ptBuffer = []; +} + + +////////////////// +// KEY SCHEDULING +////////////////// + +aes.prototype.scheduleEncrypt = function () { + this._decryptScheduled = false; + + this._w = new Array(this._nr+1); + this._w[0] = new Array(4); + for (var i=0; i < 4; i++) + this._w[0][i] = this._key[i]; + var temp = new Array(4); + for (var i=1; i < this._nr+1; i++) { + temp[0] = this._w[i-1][3]; + this._w[i] = new Array(4); + temp[0] = (this._T[2][(temp[0]>>>16)&0xff] & 0xff000000) ^ (this._T[3][(temp[0]>>>8)&0xff]&0x00ff0000) ^ (this._T[0][(temp[0]&0xff)]&0x0000ff00) ^ (this._T[1][(temp[0]>>>24)]&0x000000ff) ^ (this._RCON[i][0]<<24); + this._w[i][0] = this._w[i-1][0] ^ temp[0]; + for (var j=1; j < 4; j++) { + temp[j] = this._w[i][j-1]; + this._w[i][j] = this._w[i-1][j] ^ temp[j]; + } + } +}; + +aes.prototype.scheduleDecrypt = function() { + + if (!this._w) this.scheduleEncrypt(); + this._decryptScheduled = true; + var temp = []; + var j = this._w.length-1; + for (var i=0; i>> 24) ] & 0xff] ^ + td1[te1[(this._w[i][0] >>> 16) & 0xff] & 0xff] ^ + td2[te1[(this._w[i][0] >>> 8) & 0xff] & 0xff] ^ + td3[te1[(this._w[i][0] ) & 0xff] & 0xff]; + this._w[i][1] = td0[te1[(this._w[i][1] >>> 24) ] & 0xff] ^ + td1[te1[(this._w[i][1] >>> 16) & 0xff] & 0xff] ^ + td2[te1[(this._w[i][1] >>> 8) & 0xff] & 0xff] ^ + td3[te1[(this._w[i][1] ) & 0xff] & 0xff]; + this._w[i][2] = td0[te1[(this._w[i][2] >>> 24) ] & 0xff] ^ + td1[te1[(this._w[i][2] >>> 16) & 0xff] & 0xff] ^ + td2[te1[(this._w[i][2] >>> 8) & 0xff] & 0xff] ^ + td3[te1[(this._w[i][2] ) & 0xff] & 0xff]; + this._w[i][3] = td0[te1[(this._w[i][3] >>> 24) ] & 0xff] ^ + td1[te1[(this._w[i][3] >>> 16) & 0xff] & 0xff] ^ + td2[te1[(this._w[i][3] >>> 8) & 0xff] & 0xff] ^ + td3[te1[(this._w[i][3] ) & 0xff] & 0xff]; + } +}; + + +///////////////////////// +// ENCRYPTION/DECRYPTION +///////////////////////// + + +/* Authenticated encryption on a multi-block message in OCB or CCM mode. +iv should be an array of 32-bit words - either 4 words for OCB mode or 1, 2, or 3 words for CCM. +Use a unique IV for every message encrypted. +The plaintext argument will be encrypted and MACed; adata will be sent in plaintext but MACed. +Plaintext and adata are strings. +ciphertext is an array of bytes. tag is an array of 32-bit words. +*/ +aes.prototype.encrypt = function(iv, plaintext, ciphertext, adata, tag) { + var plaintextBytes = [], adataBytes = []; + aes.asciiToBytes(plaintext, plaintextBytes); + aes.asciiToBytes(adata, adataBytes); + + this._iv = iv; + if (this._mode == CCM) + this._CCM.encrypt(plaintextBytes, ciphertext, adataBytes, tag); + else if (this._mode == OCB) { + this._OCB.encrypt(plaintextBytes, ciphertext, adataBytes, tag); + } + + // prepend to the ciphertext the length of the iv (in bytes) and the iv + var ivbytes=[]; + aes.wordsToBytes(iv, ivbytes); + var ct = [iv.length*4].concat(ivbytes, ciphertext); + for (var i=0; i < ct.length; i++) ciphertext[i] = ct[i]; + + for (var i=0; i < ciphertext.length; i++) + this._ctBuffer[this._ctBuffer.length] = ciphertext[i]; + +}; + +/* Authenticated decryption on a multi-block ciphertext in OCB or CCM mode. +ciphertext is an array of bytes. tag is an array of 32-bit words. +plaintext and adata are strings. +*/ +aes.prototype.decrypt = function(ciphertext, adata, tag) { + var ivlen = ciphertext[0]; + var ivbytes = ciphertext.slice(1, ivlen+1); + var iv = []; + aes.bytesToWords(ivbytes, iv); + this._iv = iv; + var ct = ciphertext.slice(ivlen+1); + + var valid = false; + var plaintextBytes = [], adataBytes = []; + aes.asciiToBytes(adata, adataBytes); + if (this._mode == CCM) + valid = this._CCM.decrypt(ct, plaintextBytes, adataBytes); + else if (this._mode == OCB) + valid = this._OCB.decrypt(ct, plaintextBytes, adataBytes, tag); + if (valid) { + var plaintext = aes.bytesToAscii(plaintextBytes); + for (var i=0; i < plaintext.length; i++) + this._ptBuffer[this._ptBuffer.length] = plaintext.charAt(i); + return plaintext; + } + return ""; +}; + +// MACs (but doesn't encrypt) data using CMAC (in CCM mode) or PMAC (in OCB mode) +aes.prototype.sign = function(data, tag) { + if (this._mode == CCM) + this._CCM.CMAC(data, "", tag, this._Tlen, false); + else if (this._mode == OCB) { + this._OCB.PMAC(data, tag); + } +}; + +// Verifies a CMAC or PMAC tag +aes.prototype.verify = function(data, tag) { + var validTag = []; + if (this._mode == CCM) + this._CCM.CMAC(data, "", validTag, this._Tlen, false); + else if (this._mode == OCB) { + this._OCB.PMAC(data, validTag); + } + if (validTag.length != tag.length) return false; + for (var i=0; i < tag.length; i++) { + if (tag[i] != validTag[i]) return false; + } + return true; +}; + +/* Encrypts a single block message in AES. Takes the plaintext, an array in which to dump +the ciphertext, and a boolean decrypt argument. If set to true, this function acts as +a decryption function. +block and ciphertext are both arrays of 4 32-bit words. +*/ +aes.prototype.encryptBlock = function(block, ciphertext, decrypt) { + if (!decrypt && this._decryptScheduled) this.scheduleEncrypt(); + + // get key schedule + var w = this._w; + // load round transformation tables + var te0, te1, te2, te3; + if (decrypt) { + te0 = this._Tin[0]; + te1 = this._Tin[1]; + te2 = this._Tin[2]; + te3 = this._Tin[3]; + } else { + te0 = this._T[0]; + te1 = this._T[1]; + te2 = this._T[2]; + te3 = this._T[3]; + } + + // perform rounds + var rk = w[0]; + var s0 = block[0] ^ rk[0]; + var s1 = block[1] ^ rk[1]; + var s2 = block[2] ^ rk[2]; + var s3 = block[3] ^ rk[3]; + var t0,t1,t2,t3; + rk = w[1]; + var order = []; + for (var round = 1; round < w.length-1; round++) { + order = [s1, s2, s3, s0]; + if (decrypt) order = [s3, s0, s1, s2]; + t0 = te0[(s0>>>24)] ^ te1[(order[0]>>>16) & 0xff]^ te2[(s2>>>8)&0xff] ^ te3[order[2]&0xff] ^ rk[0]; + t1 = te0[(s1>>>24)] ^ te1[(order[1]>>>16) & 0xff]^ te2[(s3>>>8)&0xff] ^ te3[order[3]&0xff] ^ rk[1]; + t2 = te0[(s2>>>24)] ^ te1[(order[2]>>>16) & 0xff]^ te2[(s0>>>8)&0xff] ^ te3[order[0]&0xff] ^ rk[2]; + t3 = te0[(s3>>>24)] ^ te1[(order[3]>>>16) & 0xff]^ te2[(s1>>>8)&0xff] ^ te3[order[1]&0xff] ^ rk[3]; + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + rk = w[round+1]; + } + if (decrypt) { + s0 = ((this._INV_SBOX[(t0>>>24)])<<24) ^ ((this._INV_SBOX[(t3>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t2>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t1)&0xff]) ^ rk[0]; + s1 = ((this._INV_SBOX[(t1>>>24)])<<24) ^ ((this._INV_SBOX[(t0>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t3>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t2)&0xff]) ^ rk[1] + s2 = ((this._INV_SBOX[(t2>>>24)])<<24) ^ ((this._INV_SBOX[(t1>>>16)&0xff])<<16) ^ ((this._INV_SBOX[(t0>>>8)&0xff])<<8) ^ (this._INV_SBOX[(t3)&0xff]) ^ rk[2]; + s3 = (this._INV_SBOX[(t3>>>24)]<<24) ^ (this._INV_SBOX[(t2>>>16)&0xff]<<16) ^ (this._INV_SBOX[(t1>>>8)&0xff]<<8) ^ (this._INV_SBOX[(t0)&0xff]) ^ rk[3]; + } else { + s0 = (te2[t0>>>24]&0xff000000) ^ (te3[(t1>>>16)&0xff]&0x00ff0000) ^ (te0[(t2>>>8)&0xff]&0x0000ff00) ^ (te1[(t3)&0xff]&0x000000ff) ^ rk[0]; + s1 = (te2[t1>>>24]&0xff000000) ^ (te3[(t2>>>16)&0xff]&0x00ff0000) ^ (te0[(t3>>>8)&0xff]&0x0000ff00) ^ (te1[(t0)&0xff]&0x000000ff) ^ rk[1]; + s2 = (te2[t2>>>24]&0xff000000) ^ (te3[(t3>>>16)&0xff]&0x00ff0000) ^ (te0[(t0>>>8)&0xff]&0x0000ff00) ^ (te1[(t1)&0xff]&0x000000ff) ^ rk[2]; + s3 = (te2[t3>>>24]&0xff000000) ^ (te3[(t0>>>16)&0xff]&0x00ff0000) ^ (te0[(t1>>>8)&0xff]&0x0000ff00) ^ (te1[(t2)&0xff]&0x000000ff) ^ rk[3]; + } + ciphertext[0] = s0; + ciphertext[1] = s1; + ciphertext[2] = s2; + ciphertext[3] = s3; +}; + +// As above, block and plaintext are arrays of 4 32-bit words. +aes.prototype.decryptBlock = function(block, plaintext) { + if (!this._decryptScheduled) this.scheduleDecrypt(); + + this.encryptBlock(block, plaintext, true); +}; + + +//////////////////// +// HELPER FUNCTIONS +//////////////////// + +aes._hex = function(n) { + var out = "",i,digits="0123456789ABCDEF"; + for (i=0; i<8; i++) { + var digit = n&0xF; + out = digits.substring(digit,digit+1) + out; + n = n >>> 4; + } + return out; +} + +aes._hexall = function(nn) { + var out = "",i; + for (i=0;i>> (8*(3-j)); + } + } +}; + +aes.bytesToWords = function(bytes, words) { + var paddedBytes = bytes.slice(); + while (paddedBytes.length % 4 != 0) paddedBytes.push(0); + var num_words = Math.floor(paddedBytes.length/4); + for (var j=0; j < num_words; j++) + words[j] = ((paddedBytes[(j<<2)+3]) | (paddedBytes[(j<<2)+2] << 8) | (paddedBytes[(j<<2)+1] << 16) | (paddedBytes[j<<2] << 24)); +}; + + +/////////////////////////////////////// +// KEY DERIVATION +////////////////////////////////////// + +// password is a string, presumably a password entered by the user. +// salt is eight random bytes associated with each user +// This function returns an array of bytes of length 16 +function generateKey(password, salt) { + var pwBytes = []; + aes.asciiToBytes(password, pwBytes); + var pwWords = [], saltWords = []; + aes.bytesToWords(pwBytes, pwWords); + aes.bytesToWords(salt, saltWords); + + var iterations = 1000; + + var derivedKey = []; + var blockIndex = 1; + + var xorHashes = function(h1, h2) { + var xor = []; + var i; + for (i=0; i < h1.length; i++) xor.push(h1[i] ^ h2[i]); + return xor; + }; + + while (derivedKey.length < 16) { + var hashBytes = pwWords.concat(saltWords); + hashBytes.push(blockIndex); + var T = SHA256.hash_words_big_endian(hashBytes); + var u = T; + for (var i=2; i < iterations; i++) { + var hash = SHA256.hash_words_big_endian(pwWords.concat(u)); + u = xorHashes(T, hash); + } + var block = []; + aes.wordsToBytes(T, block); + for (var i=0; i < block.length; i++) derivedKey.push(block[i]); + } + + if (derivedKey.length > 16) derivedKey.length = 16; + return derivedKey; +} + +/////////////////////////////////////// +// ROUND TRANSFORMATION PRECOMPUTATION +/////////////////////////////////////// + + +// Precomputation code by Mike Hamburg + +aes.prototype._precompute = function() { + var x,xi,sx,tx,tisx,i; + var d=[]; + + /* compute double table */ + for (x=0;x<256;x++) { + d[x]= x&128 ? x<<1 ^ 0x11b : x<<1; + //d[x] = x<<1 ^ (x>>7)*0x11b; //but I think that's less clear. + } + + /* Compute the round tables. + * + * We'll need access to x and x^-1, which we'll get by walking + * GF(2^8) as generated by (82,5). + */ + for(x=xi=0;;) { + // compute sx := sbox(x) + sx = xi^ xi<<1 ^ xi<<2 ^ xi<<3 ^ xi<<4; + sx = sx>>8 ^ sx&0xFF ^ 0x63; + + var dsx = d[sx], x2=d[x],x4=d[x2],x8=d[x4]; + + // te(x) = rotations of (2,1,1,3) * sx + tx = dsx<<24 ^ sx<<16 ^ sx<<8 ^ sx^dsx; + + // similarly, td(sx) = (E,9,D,B) * x + tisx = (x8^x4^x2) <<24 ^ + (x8^x ) <<16 ^ + (x8^x4^x ) << 8 ^ + (x8^x2^x ); + + // This can be done by multiplication instead but I think that's less clear + // tisx = x8*0x1010101 ^ x4*0x1000100 ^ x2*0x1000001 ^ x*0x10101; + // tx = dsx*0x1000001^sx*0x10101; + + // rotate and load + for (i=0;i<4;i++) { + this._T[i][x] = tx; + this._Tin[i][sx] = tisx; + tx = tx<<24 | tx>>>8; + tisx = tisx<<24 | tisx>>>8; + } + + // te[4] is the sbox; td[4] is its inverse + this._SBOX[ x] = sx; + this._INV_SBOX[sx] = x; + + + // wonky iteration goes through 0 + if (x==5) { + break; + } else if (x) { + x = x2^d[d[d[x8^x2]]]; // x *= 82 = 0b1010010 + xi ^= d[d[xi]]; // xi *= 5 = 0b101 + } else { + x=xi=1; + } + } + + // We computed the arrays out of order. On Firefox, this matters. + // Compact them. + for (i=0; i<4; i++) { + this._T[i] = this._T[i].slice(0); + this._Tin[i] = this._Tin[i].slice(0); + } + this._SBOX = this._SBOX.slice(0); + this._INV_SBOX = this._INV_SBOX.slice(0); + + +}; + + + + + +/* jsCrypto +CCM mode + +Emily Stark (estark@stanford.edu) +Mike Hamburg (mhamburg@stanford.edu) +Dan Boneh (dabo@cs.stanford.edu) + +CCM mode for authenticated encryption of multiple 16-byte blocks. Uses AES as core cipher. + +Public domain, 2009. + +*/ + +// Constructor takes an aes object as its core cipher +function cipherCCM(cipher) { + this._cipher = cipher; +} + +/* Formats plaintext and adata for MACing and encryption. +adata and plaintext are arrays of bytes, B will be an array of arrays of 16 bytes +Tlen specifies the number of bytes in the tag. +Formatted according to the CCM specification. + */ +cipherCCM.prototype._formatInput = function(adata, plaintext, Tlen, B) { + // compute B[0] + var flags, nbytes=[]; + aes.wordsToBytes(this._cipher._iv, nbytes); + if (adata) flags = 0x01<<6; + else flags = 0x00<<6; + flags = flags | (((Tlen-2)/2)<<3); // (t-2)/2 + var q = 15-this._cipher._iv.length*4; + flags = flags | (q-1); + B[0] = new Array(16); + B[0][0] = flags; + for (var i=1; i <= 15-q; i++) B[0][i] = nbytes[i-1]; + var Q = plaintext.length; + + // make some bitmasks + var bitmask = 1; + for (var i=0; i < 7; i++) bitmask = (bitmask<<1) | 1; + for (var i=15; i > 15-q; i--) { + B[0][i] = Q & bitmask; + Q = Q>>>8; + } + + // compute the blocks which identify adata + if (adata) { + var a = adata.length, Bind=1, BIind = 0, aind=0; + B[1] = new Array(16); + if (a < (2<<16 - 2<<8)) { + B[1][0] = a>>>8; + B[1][1] = a & bitmask; + BIind = 2; + } else if (a < (2<<32)) { + B[1][0] = 0xff; + B[1][1] = 0xfe; + for (var i=5; i >= 0; i--) { + B[1][2+i] = a & bitmask; + a = a>>>8; + } + BIind=8; + } else { + B[1][0] = 0xff; + B[1][0] = 0xff; + for (i=9; i >= 0; i--) { + B[1][2+i] = a & bitmask; + a = a >>> 8; + } + BIind = 12; + } + } + + while (aind < adata.length) { + B[Bind][BIind] = adata[aind]; + aind++; + if (BIind == 15) { + Bind++; + BIind = 0; + if (aind != adata.length) B[Bind] = new Array(16); + } else BIind++; + } + if (BIind != 0) { + while (BIind <= 15) { + B[Bind][BIind] = 0x00; + BIind++; + } + } + + Bind++; + BIind=0; + B[Bind] = new Array(16); + + // compute the payload blocks + var pind = 0; + while (pind < plaintext.length) { + B[Bind][BIind] = plaintext[pind]; + pind++; + if (BIind == 15) { + Bind++; + BIind = 0; + if (pind != plaintext.length) B[Bind] = new Array(16); + } else BIind++; + } + if (BIind != 0) { + while (BIind <= 15) { + B[Bind][BIind] = 0x00; + BIind++; + } + } + +}; + +/* Generate the blocks that will be used as counters. +ctr will be an array of m+1 arrays of 16 bytes. */ +cipherCCM.prototype._generateCtrBlocks = function(m, ctr) { + var nbytes = []; + aes.wordsToBytes(this._cipher._iv, nbytes); + var flags = 15 - (this._cipher._iv.length*4) - 1; + var bitmask = 1; + for (var i=0; i < 7; i++) bitmask = (bitmask<<1) | 1; + for (var i=0; i <= m; i++) { + ctr[i] = new Array(16); + ctr[i][0] = flags; + for (var j=0; j < nbytes.length; j++) { + ctr[i][j+1] = nbytes[j]; + } + for (var j=15; j > nbytes.length; j--) { + ctr[i][j] = (i>>>(8*(15-j))) & bitmask; + } + } + +}; + + +/* CBC-MAC adata and plaintext, and store the tag in tag. +adata and plaintext are arrays of bytes +tag will be an array of Tlen/4 32-bit words +Tlen is an integer divisible by 4 that specifies the number of bytes in the tag. +*/ +cipherCCM.prototype.CBCMAC = function(adata, plaintext, tag, Tlen, formatInput) { + var B = []; + if (formatInput) + this._formatInput(adata,plaintext,Tlen,B); + else { + var Sind = 0, SIind = 0, aind = 0, alen = adata.length; + B[0] = []; + while (aind < alen) { + B[Sind][SIind] = adata[aind]; + SIind++; + if (SIind == 16) { + SIind = 0; + Sind++; + if (aind != alen-1) B[Sind] = []; + } + aind++; + } + } + var words = []; + var Yprev = [], Y = []; + aes.bytesToWords(B[0],words); + this._cipher.encryptBlock(words, Y); + var r = B.length, t = new Array(4); + + for (var i=1; i < r; i++) { + for (var j=0; j < 4; j++) { + var bstart = j*4; + t[j] = Y[j] ^ ((B[i][bstart++]<<24) | (B[i][bstart++]<<16) | (B[i][bstart++]<<8) | (B[i][bstart++])); + Yprev[j] = Y[j]; + } + this._cipher.encryptBlock(t, Y); + } + for (var i=0; i < Tlen/4; i++) + tag[i] = Y[i]; +}; + + +/* Provides authenticated encryption using CBCMAC and CTR-mode encryption on plaintext. +adata is MACed but not encrypted. +plaintext, adata, and tag are arrays of bytes +Tlen is the number of bytes in the tag +ciphertext will be an array of bytes. */ +cipherCCM.prototype.encrypt = function(plaintext, ciphertext, adata, tag) { + var Tlen = this._cipher._Tlen; + this.CBCMAC(adata, plaintext, tag, Tlen, true); + var ctr = [], m = Math.ceil(plaintext.length/16); + this._generateCtrBlocks(m, ctr); + var cblocks = [], S=[], t = new Array(4); + for (var i=0; i <= m; i++) { + S[i] = new Array(16); + aes.bytesToWords(ctr[i], cblocks); + this._cipher.encryptBlock(cblocks, t); + aes.wordsToBytes(t, S[i]); + } + var Sind = 1, SIind = 0; + for (var i=0; i < plaintext.length; i++) { + ciphertext[i] = plaintext[i] ^ S[Sind][SIind]; + SIind++; + if (SIind == 16) { + Sind++; + SIind = 0; + } + } + var tbytes = []; + aes.wordsToBytes(tag, tbytes); + var cstart = plaintext.length; + for (var i=0; i < Tlen; i++) + ciphertext[cstart+i] = tbytes[i] ^ S[0][i]; +}; + + +/* Decrypt and verify the MAC on ciphertext and adata. The integrity of adata is verified, but isn't decrypted. +ciphertext, adata are arrays of bytes +plaintext will be an array of bytes +Returns true if tag is valid, false otherwise. +*/ +cipherCCM.prototype.decrypt = function(ciphertext, plaintext, adata) { + var Tlen = this._cipher._Tlen; + if (ciphertext.length <= Tlen) return false; + var ctr = [], tag = new Array(Tlen), m = Math.ceil(ciphertext.length/16); + this._generateCtrBlocks(m, ctr); + var S = [], t = new Array(4), cblocks=[]; + + for (var i=0; i <= m; i++) { + S[i] = new Array(16); + aes.bytesToWords(ctr[i], cblocks); + this._cipher.encryptBlock(cblocks, t); + aes.wordsToBytes(t, S[i]); + } + + var Sind = 1, SIind = 0; + for (var i=0; i < (ciphertext.length-Tlen); i++) { + plaintext[i] = ciphertext[i] ^ S[Sind][SIind]; + SIind++; + if (SIind == 16) { + SIind = 0; + Sind++; + } + } + + for (var i=0; i < Tlen; i++) + tag[i] = ciphertext[ciphertext.length-Tlen+i] ^ S[0][i]; + + // verify integrity + var validTag = [], vtbytes = []; + this.CBCMAC(adata, plaintext, validTag, Tlen, true); + aes.wordsToBytes(validTag, vtbytes); + for (var i=0; i < Tlen; i++) { + if (vtbytes[i] != tag[i]) + return false; + } + return true; + +}; + +// Generate subkeys according to the CCM specification. */ +cipherCCM.prototype._generateSubkeys = function(k1,k2) { + var t = [0x00000000,0x00000000,0x00000000,0x00000000], t2 = new Array(4); + this._cipher.encryptBlock(t, t2); + for (var i=0; i < 3; i++) + k1[i] = t2[i]<<1 | t2[i+1]>>>31; + k1[3] = t2[3]<<1; + if (t2[0]>>>31 != 0) + k1[3] = k1[3] ^ 135; + for (var i=0; i < 3; i++) + k2[i] = k1[i]<<1 | k1[i+1]>>>31; + k2[3] = k1[3]<<1; + if (k1[0]>>>31 != 0) + k2[3] = k2[3] ^ 135; +}; + + +/* CMAC used for integrity only (no encryption). */ +cipherCCM.prototype.CMAC = function(adata, plaintext, tag, Tlen, formatInput) { + var B = [], t = new Array(4); // will be an array of arrays of 16 bytes + if (formatInput) + this._formatInput(adata,plaintext,Tlen,B); + else { + var Sind = 0, SIind = 0, aind = 0, alen = adata.length; + B[0] = []; + while (aind < alen) { + B[Sind][SIind] = adata[aind]; + SIind++; + if (SIind == 16) { + SIind = 0; + Sind++; + if (aind != alen-1) B[Sind] = []; + } + aind++; + } + } + var k1 = new Array(4), k2 = new Array(4); + this._generateSubkeys(k1,k2); + var last = B.length-1, kbytes = []; + if (alen % 16 == 0) { + aes.wordsToBytes(k1, kbytes); + } else { + aes.wordsToBytes(k2, kbytes); + B[last][B[last].length] = 1<<7; + while (B[last].length % 16 != 0) + B[last][B[last].length] = 0x00; + } + for (var i=0; i < 16; i++) B[last][i] = B[last][i] ^ kbytes[i]; + var C = [0x00000000,0x00000000,0x00000000,0x00000000], Cprev = new Array(4), words = new Array(4); + for (var i=0; i < B.length; i++) { + aes.bytesToWords(B[i], words); + for (var j=0; j < 4; j++) { + Cprev[j] = C[j]; + t[j] = C[j] ^ words[j]; + } + this._cipher.encryptBlock(t, C); + } + var cbytes=[]; + aes.wordsToBytes(C, cbytes); + for (var i=0; i < Tlen; i++) + tag[i] = cbytes[i]; + +}; + + + +/* jsCrypto +OCB mode + +Emily Stark (estark@stanford.edu) +Mike Hamburg (mhamburg@stanford.edu) +Dan Boneh (dabo@cs.stanford.edu) + +OCB mode for authenticated encryption of multiple 16-byte blocks. Uses AES as core cipher. + +Public domain, 2009. +*/ + +/* Constructor takes an aes object as the core cipher. */ +function cipherOCB(cipher) { + this._cipher = cipher; +} + + +/* Provides integrity only, no encryption. +header is an array of bytes, tag will be an array of 4 32-bit words */ +cipherOCB.prototype.PMAC = function(header, tag) { + var carry, t = new Array(4), t2 = new Array(4), Checksum = [0x00000000,0x00000000,0x00000000,0x00000000]; + var Offset = new Array(4); + this._cipher.encryptBlock(Checksum, Offset); + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = t[i] ^ Offset[i]; + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = t[i] ^ Offset[i]; + + // accumulate all but the last block + var num_blocks = Math.floor((header.length-1)/16); + for (var i=0; i < num_blocks; i++) { + this._times2(Offset,Offset); + var bstart = i*16; // start-of-block index + for (var j=0; j < 4; j++) + t[j] = Offset[j] ^ ((header[bstart+(j<<2)+3]) | (header[bstart+(j<<2)+2] << 8) | (header[bstart+(j<<2)+1] << 16) | (header[bstart+(j<<2)] << 24)); + this._cipher.encryptBlock(t, t2); + for (var j=0; j < 4; j++) Checksum[j] = Checksum[j] ^ t2[j]; + } + + // accumulate the last block + this._times2(Offset,Offset); + + if (header.length%16 == 0) { + var bstart = header.length-16; + for (var j=0; j < 4; j++) + Checksum[j] = Checksum[j] ^ ((header[bstart+(j<<2)+3]) | (header[bstart+(j<<2)+2] << 8) | (header[bstart+(j<<2)+1] << 16) | (header[bstart+(j<<2)] << 24)); + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i]; + } else { + var block_bytes = [], block = new Array(4), len = header.length, ind=0; + for (var i=(header.length-(header.length%16)); i < len; i++) { + block_bytes[ind] = header[i]; + ind++; + } + block_bytes[ind] = 0x80; + ind++; + while (block_bytes.length%16 != 0) { + block_bytes[ind] = 0x00; + ind++; + } + aes.bytesToWords(block_bytes,block); + for (var j=0; j < 4; j++) { + var bstart = 4*j; + Checksum[j] = Checksum[j] ^ ((block_bytes[bstart++]<<24) | (block_bytes[bstart++]<<16) | (block_bytes[bstart++]<<8) | (block_bytes[bstart++])); + } + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i]; + this._times2(t, Offset); + for (var i=0; i < 4; i++) Offset[i] = Offset[i] ^ t[i]; + } + + // compute result + for (var i=0; i < 4; i++) t[i] = Offset[i] ^ Checksum[i]; + this._cipher.encryptBlock(t, tag); +}; + + +/* Encrypts and MACs plaintext, only MACS header. +plaintext, ciphertext and header are arrays of bytes. tag will be an array of 4 32-bit words. */ +cipherOCB.prototype.encrypt = function(plaintext, ciphertext, header, tag) { + var Checksum = [0x00000000,0x00000000,0x00000000,0x00000000]; + var t = [0x00000000,0x00000000,0x00000000,0x00000000], t2 = new Array(4); + var Offset = new Array(4); + this._cipher.encryptBlock(this._cipher._iv, Offset); + var cbytes = []; + + // encrypt and accumulate all but last block + var num_blocks = Math.floor((plaintext.length-1)/16), bstart=0, block = new Array(4); + for (var i=0; i < num_blocks; i++) { + this._times2(Offset,Offset); + bstart = 16*i; + for (var j=0; j < 4; j++) + block[j] = ((plaintext[bstart+(j<<2)+3]) | (plaintext[bstart+(j<<2)+2] << 8) | (plaintext[bstart+(j<<2)+1] << 16) | (plaintext[bstart+(j<<2)] << 24)); + for (var j=0; j < 4; j++) + t[j] = Offset[j] ^ block[j]; + this._cipher.encryptBlock(t,t2); + for (var j=0; j < 4; j++) t[j] = Offset[j] ^ t2[j]; + aes.wordsToBytes(t, cbytes); + for (var j=0; j < 16; j++) ciphertext[bstart+j] = cbytes[j]; + for (var j=0; j < 4; j++) Checksum[j] = Checksum[j] ^ block[j]; + } + + // encrypt and accumulate last block + var num_bytes = plaintext.length%16; + if ((num_bytes == 0) && (plaintext.length > 0)) num_bytes=16; + this._times2(Offset,Offset); + t = [0x00000000,0x00000000,0x00000000,0x00000000]; + t[3] = num_bytes*8; + for (var i=0; i < 4; i++) t[i] = Offset[i] ^ t[i]; + var Pad = new Array(4); + this._cipher.encryptBlock(t, Pad); + var pad_bytes = new Array(16); + aes.wordsToBytes(Pad, pad_bytes); + var tempbytes = []; + bstart = plaintext.length-num_bytes; + for (var i=0; i < num_bytes; i++) { + ciphertext[bstart+i] = plaintext[bstart+i] ^ pad_bytes[i]; + tempbytes[tempbytes.length] = plaintext[bstart+i]; + } + for (var i=num_bytes; i < 16; i++) + tempbytes[tempbytes.length] = pad_bytes[i]; + aes.bytesToWords(tempbytes, t); + for (var i=0; i < 4; i++) Checksum[i] = Checksum[i] ^ t[i]; + + // compute authentication tag + this._times2(t,Offset); + for (var i=0; i < 4; i++) { + Offset[i] = t[i] ^ Offset[i]; + t[i] = Checksum[i] ^ Offset[i]; + } + this._cipher.encryptBlock(t,t2); + if (header.length > 0) { + this.PMAC(header, t); + for (var i=0; i < 4; i++) tag[i] = t[i] ^ t2[i]; + } else { + for (var i=0; i < 4; i++) tag[i] = t2[i]; + } +}; + + +/* Decrypts and verifies integrity of ciphertext, only verifies integrity of header. +ciphertext, plaintext, and header are arrays of bytes. tag is an array of 4 32-bit words. +Returns true if tag is valid, false otherwise. */ +cipherOCB.prototype.decrypt = function(ciphertext, plaintext, header, tag) { + var Offset = new Array(4), Checksum = [0x00000000,0x00000000,0x00000000,0x00000000]; + this._cipher.encryptBlock(this._cipher._iv, Offset); + + var t = new Array(4), t2 = new Array(4), block = new Array(4); + + // decrypt and accumulate first m-1 blocks + var num_blocks = Math.floor((ciphertext.length-1)/16); + var bstart = 0, pbytes = new Array(16); + this._cipher.scheduleDecrypt(); + for (var i=0; i < num_blocks; i++) { + this._times2(Offset,Offset); + bstart = i*16; + for (var j=0; j < 4; j++) + t[j] = Offset[j] ^ ((ciphertext[bstart+(j<<2)+3]) | (ciphertext[bstart+(j<<2)+2] << 8) | (ciphertext[bstart+(j<<2)+1] << 16) | (ciphertext[bstart+(j<<2)] << 24)); + this._cipher.decryptBlock(t,t2); + for (var j=0; j < 4; j++) { + block[j] = Offset[j] ^ t2[j]; + Checksum[j] = block[j] ^ Checksum[j]; + } + aes.wordsToBytes(block,pbytes); + for (var j=0; j < 16; j++) + plaintext[bstart+j] = pbytes[j]; + } + + // decrypt and accumulate final block + var Pad = new Array(4), padbytes=[]; + this._cipher.scheduleEncrypt() + this._times2(Offset,Offset); + var num_bytes = ciphertext.length%16; + if ((num_bytes == 0) && (ciphertext.length > 0)) num_bytes=16; + t = [0x00000000,0x00000000,0x00000000,0x00000000]; + t[3] = num_bytes*8; + for (var i=0; i < 4; i++) t[i] = t[i] ^ Offset[i] + this._cipher.encryptBlock(t,Pad); + aes.wordsToBytes(Pad, padbytes); + bstart = ciphertext.length - num_bytes; + for (var i=0; i < num_bytes; i++) { + plaintext[bstart+i] = ciphertext[bstart+i] ^ padbytes[i]; + t[i] = plaintext[bstart+i]; + } + for (var i = num_bytes; i < 16; i++) + t[i] = padbytes[i]; + aes.bytesToWords(t,t2); + for (var i=0; i < 4; i++) Checksum[i] = Checksum[i] ^ t2[i]; + + // compute valid authentication tag + this._times2(t, Offset); + for (var i=0; i < 4; i++) { + Offset[i] = Offset[i] ^ t[i]; + t[i] = Offset[i] ^ Checksum[i]; + } + var validTag = new Array(4); + this._cipher.encryptBlock(t,validTag); + t = new Array(4); + if (header.length > 0) { + this.PMAC(header, t); + for (var i=0; i < 4; i++) validTag[i] = validTag[i] ^ t[i]; + } + // compute results + for (var i=0; i < 4; i++) { + if (aes._hex(tag[i]) != aes._hex(validTag[i])) { + return false; + } + } + return true; +}; + + + +cipherOCB.prototype._times2 = function(dst, src) { + var carry = src[0]>>>31; + for (var i=0; i < 3; i++) + dst[i] = (src[i]<<1) | (src[i+1]>>>31); + dst[3] = (src[3]<<1) ^ (carry * 0x87); +}; + + + + + + + + +/* +jsCrypto + +sha256.js +Mike Hamburg, 2008. Public domain. + */ + + +function SHA256() { + if (!this.k[0]) + this.precompute(); + this.initialize(); +} + +SHA256.prototype = { + /* + init:[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,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], + */ + + init:[], k:[], + + precompute: function() { + var p=2,i=0,j; + + function frac(x) { return (x-Math.floor(x)) * 4294967296 | 0 } + + outer: for (;i<64;p++) { + for (j=2;j*j<=p;j++) + if (p % j == 0) + continue outer; + + if (i<8) this.init[i] = frac(Math.pow(p,1/2)); + this.k[i] = frac(Math.pow(p,1/3)); + i++; + } + }, + + initialize:function() { + this.h = this.init.slice(0); + this.word_buffer = []; + this.bit_buffer = 0; + this.bits_buffered = 0; + this.length = 0; + this.length_upper = 0; + }, + + // one cycle of SHA256 + block:function(words) { + var w=words.slice(0),i,h=this.h,tmp,k=this.k; + + var h0=h[0],h1=h[1],h2=h[2],h3=h[3],h4=h[4],h5=h[5],h6=h[6],h7=h[7]; + + for (i=0;i<64;i++) { + if (i<16) { + tmp=w[i]; + } else { + var a=w[(i+1)&15], b=w[(i+14)&15]; + tmp=w[i&15]=((a>>>7^a>>>18^a>>>3^a<<25^a<<14) + (b>>>17^b>>>19^b>>>10^b<<15^b<<13) + w[i&15] + w[(i+9)&15]) | 0; + } + + tmp += h7 + (h4>>>6^h4>>>11^h4>>>25^h4<<26^h4<<21^h4<<7) + (h6 ^ h4&(h5^h6)) + k[i]; + + h7=h6; h6=h5; h5=h4; + h4 = h3 + tmp | 0; + + h3=h2; h2=h1; h1=h0; + + h0 = (tmp + ((h1&h2)^(h3&(h1^h2))) + (h1>>>2^h1>>>13^h1>>>22^h1<<30^h1<<19^h1<<10)) | 0; + } + + h[0]+=h0; h[1]+=h1; h[2]+=h2; h[3]+=h3; + h[4]+=h4; h[5]+=h5; h[6]+=h6; h[7]+=h7; + }, + + update_word_big_endian:function(word) { + var bb; + if ((bb = this.bits_buffered)) { + this.word_buffer.push(word>>>(32-bb) ^ this.bit_buffer); + this.bit_buffer = word << bb; + } else { + this.word_buffer.push(word); + } + this.length += 32; + if (this.length == 0) this.length_upper ++; // mmhm.. + if (this.word_buffer.length == 16) { + this.block(this.word_buffer); + this.word_buffer = []; + } + }, + + update_word_little_endian:function(word) { + word = word >>> 16 ^ word << 16; + word = ((word>>>8) & 0xFF00FF) ^ ((word<<8) & 0xFF00FF00); + this.update_word_big_endian(word); + }, + + update_words_big_endian: function(words) { + for (var i=0; i 16) { + this.block(wb.slice(0,16)); + } + + var h = this.h; + this.initialize(); + return h; + } +} + +SHA256.hash_words_big_endian = function(words) { + var s = new SHA256(); + for (var i=0; i<=words.length-16; i+=16) { + s.block(words.slice(i,i+16)); + } + s.length = i << 5; // so don't pass this function more than 128M words + if (i>> 16 ^ w[i] << 16; + w[i] = ((w[i]>>>8) & 0xFF00FF) ^ ((w[i]<<8) & 0xFF00FF00); + } + return SHA256.hash_words_big_endian(w); +} + + + + + + + +/* + + jsCrypto + + * Random.js -- cryptographic random number generator + * Mike Hamburg, 2008. Public domain. + * + * This generator uses a modified version of Fortuna. Fortuna has + * excellent resilience to compromise, relies on a state file, and is + * intended to run for a long time. As such, it does not need an + * entropy estimator. Unfortunately, Fortuna's startup in low-entropy + * conditions leaves much to be desired. + * + * This generator features the following modifications. First, the + * generator does not create the n-th entropy pool until it exhausts + * the n-1-st. This means that entropy doesn't get "stuck" in pools + * 10-31, which will never be used on a typical webpage. It also + * means that the entropy will all go into a single pool until the + * generator is seeded. + * + * Second, there is a very crude entropy estimator. The primary goal + * of this estimator is to prevent the generator from being used in + * low-entropy situations. Corresponding to this entropy estimator, + * there is a "paranoia control". This controls how many bits of + * estimated entropy must be present before the generator is used. + * The generator cannot have more than 256 bits of actual entropy in + * the main pool; rather, the paranoia control is designed to deal + * with the fact that the entropy estimator is probably horrible. + * + * Third, the "statefile" is optional and stored in a cookie. As + * such, it is not protected from multiple simultaneous usage, and so + * is treated conservatively. + */ + +Random = { + /* public */ +NOT_READY: 0, +READY: 1, +REQUIRES_RESEED: 2, + + /* generate one random word */ +random_word: function(paranoia) { + return this.random_words(1, paranoia)[0]; +}, + + /* generate nwords random words, and return them in an array */ +random_words: function(nwords, paranoia) { + var out = [], i, readiness = this.is_ready(paranoia); + + if (readiness == this.NOT_READY) + throw("Random: generator isn't seeded!"); + + else if (readiness && this.REQUIRES_RESEED) + this._reseed_from_pools(!(readiness & this.READY)); + + for (i=0; i0) { + estimated_entropy++; + x = x >>> 1; + } + } + } + this._pools[robin].update_words_big_endian([id,this._event_id++,ty||2,estimated_entropy,t,data.length].concat(data)); + break; + + case "string": + if (!estimated_entropy) { + /* English text has just over 1 bit per character of entropy. + * But this might be HTML or something, and have far less + * entropy than English... Oh well, let's just say one bit. + */ + estimated_entropy = data.length; + } + this._pools[robin].update_words_big_endian([id,this._event_id++,3,estimated_entropy,t,data.length]) + this._pools[robin].update_string(data); + break; + + default: + throw "add_entropy: must give an array, number or string" + } + + var old_ready = this.is_ready(); + + /* record the new strength */ + this._pool_entropy[robin] += estimated_entropy; + this._pool_strength += estimated_entropy; + + /* fire off events */ + if (!old_ready && this.is_ready()) + this._fire_event("seeded", Math.max(this._strength, this._pool_strength)); + + if (!old_ready) + this._fire_event("progress", this.get_progress()); +}, + + /* is the generator ready? */ +is_ready: function(paranoia) { + var entropy_required = this._PARANOIA_LEVELS[ paranoia ? paranoia : this._default_paranoia ]; + + if (this._strength >= entropy_required) { + return (this._pool_entropy[0] > this._BITS_PER_RESEED && new Date.valueOf() > this._next_reseed) ? + this.REQUIRES_RESEED | this.READY : + this.READY; + } else { + return (this._pool_strength > entropy_required) ? + this.REQUIRES_RESEED | this.NOT_READY : + this.NOT_READY; + } +}, + + /* how close to ready is it? */ +get_progress: function(paranoia) { + var entropy_required = this._PARANOIA_LEVELS[ paranoia ? paranoia : this._default_paranoia ]; + + if (this._strength >= entropy_required) { + return 1.0; + } else { + return (this._pool_strength > entropy_required) ? + 1.0 : + this._pool_strength / entropy_required; + } +}, + + /* start the built-in entropy collectors */ +start_collectors: function() { + if (this._collectors_started) return; + + if (window.addEventListener) { + window.addEventListener("load", this._load_time_collector, false); + window.addEventListener("mousemove", this._mouse_collector, false); + } else if (document.attachEvent) { + document.attachEvent("onload", this._load_time_collector); + document.attachEvent("onmousemove", this._mouse_collector); + } + else throw("can't attach event"); + + this._collectors_started = true; +}, + + /* stop the built-in entropy collectors */ +stop_collectors: function() { + if (!this._collectors_started) return; + + if (window.removeEventListener) { + window.removeEventListener("load", this._load_time_collector); + window.removeEventListener("mousemove", this._mouse_collector); + } else if (window.detachEvent) { + window.detachEvent("onload", this._load_time_collector); + window.detachEvent("onmousemove", this._mouse_collector) + } + this._collectors_started = false; +}, + +use_cookie: function(all_cookies) { + throw "TODO: implement use_cookie"; +}, + + /* add an event listener for progress or seeded-ness */ +addEventListener: function(name, callback) { + this._callbacks[name][this._callback_i++] = callback; +}, + + /* remove an event listener for progress or seeded-ness */ +removeEventListener: function(name, cb) { + var i, j, cbs=this._callbacks[name], js_temp=[]; + + /* I'm not sure if this is necessary; in C++, iterating over a + * collection and modifying it at the same time is a no-no. + */ + + for (j in cbs) + if (cbs.hasOwnProperty[j] && cbs[j] === cb) + js_temp.push(j); + + for (i=0; i= 1 << this._pools.length) { + this._pools.push(new SHA256()); + this._pool_entropy.push(0); + } + + /* how strong was this reseed? */ + this._pool_strength -= strength; + if (strength > this._strength) this._strength = strength; + + this._reseed_count ++; + this._reseed(reseed_data); +}, + +_mouse_collector: function(ev) { + var x = ev.x || ev.clientX || ev.offsetX; + var y = ev.y || ev.clientY || ev.offsetY; + Random.add_entropy([x,y], 2, "mouse"); +}, + +_load_time_collector: function(ev) { + var d = new Date(); + Random.add_entropy(d, 2, "loadtime"); +}, + +_fire_event: function(name, arg) { + var j, cbs=Random._callbacks[name], cbs_temp=[]; + + /* I'm not sure if this is necessary; in C++, iterating over a + * collection and modifying it at the same time is a no-no. + */ + + for (j in cbs) { + if (cbs.hasOwnProperty(j)) { + cbs_temp.push(cbs[j]); + } + } + + for (j=0; j. + +--> + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/DOM.test.js b/frontend/gamma/tests/tests/Clipperz/DOM.test.js new file mode 100644 index 0000000..a2aafc5 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/DOM.test.js @@ -0,0 +1,82 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +try { + var template; + var templateArgs; + var element; + var rowElement; + var tdElement; + + template = Clipperz.DOM.Helper.createTemplate( + [ + {tag:'td', children:[{tag:'img', cls:'favicon', src:'{faviconUrl}'}]}, + {tag:'td', children:[{tag:'a', href:'#', cls:'title', html:'{cardTitle}'}]}, + {tag:'td', children:[{tag:'span', cls:'directLogins', id:'{directLoginsID}'}]}, + {tag:'td', children:[{tag:'span', cls:'latestUpdate', html:'{latestUpdate}'}]}, + {tag:'td'} + ] + ); + + templateArgs = { + cardTitle: "Amazon.com", + directLoginsID: "Clipperz_PM_Components_directLogins_58", + faviconUrl: "http://www.amazon.com/favicon.ico", + latestUpdate: "", + reference: "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551" + } + + element = Clipperz.DOM.Helper.append(document.body, {tag:'table', children:[ + {tag:'theader'}, + {tag:'tbody', children:[ + {tag:'tr', id:'testRow'} + ]}, + {tag:'tfooter'} + ]}); + ok(element != null, "created the TABLE"); + + rowElement = Clipperz.DOM.get('testRow'); + ok(testRow != null, "created the ROW"); + + template.append(rowElement, templateArgs); + tdElement = Clipperz.DOM.get(templateArgs['directLoginsID']); + ok(tdElement != null, "created the TD"); + +} catch (err) { + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); +} diff --git a/frontend/gamma/tests/tests/Clipperz/Date.html b/frontend/gamma/tests/tests/Clipperz/Date.html new file mode 100644 index 0000000..5712a52 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Date.html @@ -0,0 +1,54 @@ + + + + + Clipperz.Date - TEST + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Date.test.js b/frontend/gamma/tests/tests/Clipperz/Date.test.js new file mode 100644 index 0000000..06f7dc8 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Date.test.js @@ -0,0 +1,66 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +var tests = { + + '001_test': function () { + var date; + var locale; + +// date = new Date(0); +// date.setMilliseconds(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC")); + + date = new Date(Date.parse("Fri, 21 Sep 2007 10:04:24 UTC")); + + locale = { + 'amDesignation': "am", + 'pmDesignation': "pm", +// 'shortDateFormat': "d/m/y", +// 'longDateFormat': "", + 'months': ["January", "February", "March", "April", + "May", "June", "July", "August", + "September", "October", "November", "December" ], + 'shortMonths': ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + 'days': ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], + 'shortDays': ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ] + } + + is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "d/m/y", locale), '21/09/07', "formatDate - 1"); + is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D M Y", locale), 'Fri Sep 2007', "formatDate - 2"); + is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y", locale), 'Fri, 21 Sep 2007', "formatDate - 3"); + is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s", locale), 'Fri, 21 Sep 2007 12:04:24', "formatDate - 4"); +// is(Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(date, "D, d M Y H:i:s (T)", locale), 'Fri, 21 Sep 2007 11:04:24 (CEST)', "formatDate - 5"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +} + +//============================================================================= + +SimpleTest.runDeferredTests("Clipperz.Date", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js new file mode 100644 index 0000000..5bfb8c7 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.data.js @@ -0,0 +1,910 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +var testData = {} + +testData['Barb_Newman_data'] = ""; +testData['Barb_Newman_data'] = testData['Barb_Newman_data'] + + "[Domain Administration Account]" + "\n" + + "Group: Windows" + "\n" + + "User Name: _ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Enquiro Domain]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: This is an Exchange Mailbox checked by IT/Programming" + "\n" + + "" + "\n" + + "[Enquiro Domain Administrator Account]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ENQUIRO\ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Obsolete" + "\n" + + "" + "\n" + + "[Enquiro Domain Administrator Account]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ENQUIRO\ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Changed on 07 Sep 2007 by Randy Kissick" + "\n" + + "" + "\n" + + "[Enquiro Domain Previous Administrator Account]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ENQUIRO\ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[Local Administrator Account for most Machines]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Local Administrator Account for some Machines]" + "\n" + + "Group: Windows" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Bugzilla]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BUGZILLA" + "\n" + + "" + "\n" + + "[Client Services Linux Box]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 192.168.1.141" + "\n" + + "" + "\n" + + "[ENSQL2 BIOS]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Eye Tracking PC]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[IT Linux Box (Brainiac)]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Maizal - Contract Developer Machine]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: 199.185.139.69:3399" + "\n" + + "Password: 123456" + "\n" + + "Notes: Software Development Contractors use remote access to access this machine.\r\n\r\nTested August 08.\r\n\r\nBe sure to send the info via two different delivery methods." + "\n" + + "" + "\n" + + "[NETGEAR WGR614v3]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: (192.168.1.11)" + "\n" + + "" + "\n" + + "[SEP Firewall (192.168.1.1)]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Changed to this on 2007/01/31" + "\n" + + "" + "\n" + + "[SEP Firewall (192.168.1.1)]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 192.168.1.1" + "\n" + + "" + "\n" + + "[UPS]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Wireless WPA-PSK]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: synergize" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Gord's Laptop Adminstrator 123456" + "\n" + + "Group: Hardware" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Wireless Access Point]" + "\n" + + "Group: Hardware" + "\n" + + "User Name: SSID: ENWRLSS" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: WPA (TKIP) key is in password 123456" + "\n" + + "" + "\n" + + "[Adobe Account]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[APC UPS Website]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Web site for UPS Drivers/Manuals" + "\n" + + "" + "\n" + + "[ask.enquiro.com admin]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: ask.enquiro.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Jody is the admin\r\nChris is the editor" + "\n" + + "" + "\n" + + "[ask.enquiro.com ftp]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: ask.enquiro.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: ftp.ask.enquiro.com\r\nchanged 02 Jun 08" + "\n" + + "" + "\n" + + "[BulkRegister]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC " + "\n" + + "URL: https://www.bulkregister.com/Login.asp?" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used for domain registrations" + "\n" + + "" + "\n" + + "[controlpanel.provisiondata.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: SEIReports.com Email address management" + "\n" + + "" + "\n" + + "[controlpanel.provisiondata.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: " + "\n" + + "Notes: Searchengineposition.com Email address management" + "\n" + + "" + "\n" + + "[Dell Canada]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to order equirpment from Dell\r\nCredit Card information is Tracy Kalancha AmEx" + "\n" + + "" + "\n" + + "[Feedback Server]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.nsurvey.org/members/login.aspx" + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ftp.enquiro.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: TYRANUS (199.60.252.157)\r\nchanged 25 Jun 08" + "\n" + + "" + "\n" + + "[ftp.enquirolabs.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: enquirolabs.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Changed 04 Jun 08" + "\n" + + "" + "\n" + + "[ftp://ftp.b2bexpertseries.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: b2bexpertseries.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Changed 02 Jun 08" + "\n" + + "" + "\n" + + "[HSBC Bank Account]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: hsbc.ca" + "\n" + + "Password: " + "\n" + + "Notes: What is my Mother's Name: BARBARA\r\nSecurity Code is generated by the Security Device - you have 10 seconds to enter it." + "\n" + + "" + "\n" + + "[HSBC Fx Trading]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://fxtrading.hsbc.ca/fx-canada/login.html" + "\n" + + "Password: 123456" + "\n" + + "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + + "" + "\n" + + "[Industry Canada - Canadian Company Capabilities (CCC)]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.ic.gc.ca" + "\n" + + "Password: 123456" + "\n" + + "Notes: Our listing: http://www.ic.gc.ca/app/ccc/srch/nvgt.do;jsessionid=0000RKFbMEOs2xvyRNoCF4pH3Ym:1247nks53?lang=eng&prtl=1&profile=cmpltPrfl&V_TOKEN=1203707557897&V_SEARCH.command=navigate&V_SEARCH.docsStart=1&V_SEARCH.resultsJSP=/prfl.do&V_DOCUMENT.docRank=1&V_SEARCH.docsCount=3&estblmntNo=234567061957&profileId=\r\n\r\nAndrew is responsible to update" + "\n" + + "" + "\n" + + "[Internet Secure CAD 1086]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://www.internetsecure.com/merchants/" + "\n" + + "Password: 123456" + "\n" + + "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + + "" + "\n" + + "[Internet Secure USD 1087]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://www.internetsecure.com/merchants/" + "\n" + + "Password: 123456" + "\n" + + "Notes: Doug to advise when he changes the password. Software requests change on a regular basis." + "\n" + + "" + "\n" + + "[louisville.net-radar.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: FTP/FrontPage" + "\n" + + "" + "\n" + + "[Microsoft Licensing Program eOpen]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://eOpen.microsoft.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to record all Microsoft licensing information" + "\n" + + "" + "\n" + + "[OSTEC Job Site]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[OutOfMyGord.com Blog Login]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: VADER" + "\n" + + "" + "\n" + + "[OutOfMyGord.com Web Site]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: VADER" + "\n" + + "" + "\n" + + "[Paypal@enquiro.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[PRWeb]" + "\n" + + "Group: Websites" + "\n" + + "User Name: shermantracy" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ScanMail Logon]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Scanmail Logon (Anti-Spam)" + "\n" + + "" + "\n" + + "[secure.searchengineposition.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: TYRANUS (199.60.252.237)" + "\n" + + "" + "\n" + + "[seireports.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.seireports.com/" + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[sepreports.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.sepreports.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used for monthly client reporting" + "\n" + + "" + "\n" + + "[septraffic.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Spiceworks]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://endc3:9675/dashboard" + "\n" + + "Password: 123456" + "\n" + + "Notes: Is installed on endc3. \r\nIt's used to inventory the hardware attached to the network. \r\nIt's scheduled to run daily at 10:00am. \r\nMachine's must be on to be detected.\r\n\r\nNote: first character of password is a zero\r\n\r\n\r\nhttp://www.spiceworks.com" + "\n" + + "" + "\n" + + "[SurveyMonkey Enquiro]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.surveymonkey.com" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used for small Enquiro surveys that aren't research related" + "\n" + + "" + "\n" + + "[SwishZone]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Tobii.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: " + "\n" + + "Notes: Tobii Website Logon" + "\n" + + "" + "\n" + + "[Trend Micro]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://olr.trendmicro.com/registration/" + "\n" + + "Password: 123456" + "\n" + + "Notes: 23 Jan 08 - I logged a bug with Trend to merge the DougWilson account with this account. /bn\r\n\r\n31 Jan 07 - Done!" + "\n" + + "" + "\n" + + "[Watchguard VPN Administrator]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://10.99.50.254" + "\n" + + "Password: 123456" + "\n" + + "Notes: Log on here to adminster the VPN, create wgx files and user passphrase\r\n\r\n\r\n\r\n" + "\n" + + "" + "\n" + + "[Watchguard VPN hardware support website]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: https://www.watchguard.com/" + "\n" + + "Password: 123456" + "\n" + + "Notes: Enquiro's VPN hardware support website\r\n\r\n\r\n\r\n\r\n" + "\n" + + "" + "\n" + + "[Webtrain]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://www.webtrain.com/" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to set up webinars. \r\nOwner username can give permisions to share with other users, and those users can create login's.\r\n\r\nHours are associated with the gord@searchengineposition.com account" + "\n" + + "" + "\n" + + "[Whitelist & Spam Trainer (Jeremy's)]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: http://my.email-as.net" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to:\r\n- add email addresses for clients, prospects or other contacts to the email whitelist\r\n- train Jeremy's system as spam or not spam.\r\n\r\nJeremy uses SpamAssassin " + "\n" + + "" + "\n" + + "[www.amazon.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[www.digitalriver.com]" + "\n" + + "Group: Websites" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[www.kelownarockets.com/store/ssl/admin/menu.asp]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: GEONOSIS" + "\n" + + "" + "\n"; + +testData['Barb_Newman_data'] = testData['Barb_Newman_data'] + + "[www.webnames.ca]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 27 Mar 08 - Logged on but site has no domains listed. We no longer use this service, as I have been managing all domains on bulkregister for over a year. /bn" + "\n" + + "" + "\n" + + "[Yahooligans]" + "\n" + + "Group: Websites" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Webtrends Server" + "\n" + + "" + "\n" + + "[Anti-Virus]" + "\n" + + "Group: Services" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENDEV1 SQL Server Service Account]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENDEV1" + "\n" + + "" + "\n" + + "[ENDEV2]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENDEV2" + "\n" + + "" + "\n" + + "[Enquiro Domain - BackUpExec]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[Enquiro Domain - SEIService Account]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENAPP1" + "\n" + + "" + "\n" + + "[Enquiro Domain - SQLServer]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1/ENSQL2" + "\n" + + "" + "\n" + + "[Enquiro Domain - SQLServer]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENQUIRO/SEIService User Account]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ENSPS1 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Exchange Email Archive]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Cory changed this on 2007/01/31 to 123456" + "\n" + + "" + "\n" + + "[MySQL]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BUGZILLA" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[SEIWEB1/SEIWEB2 Anonymous User]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BLENDER" + "\n" + + "" + "\n" + + "[Sharepoint Single Sign On Acct]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[SourceSafe on ENDEV1]" + "\n" + + "Group: Services" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENDEV1" + "\n" + + "" + "\n" + + "[Bugzilla Database]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: BUGZILLA" + "\n" + + "" + "\n" + + "[Bugzilla Database]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENDEV1" + "\n" + + "" + "\n" + + "[ENDOC1 Goldmine SQL2005]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: added 19 Oct 2007 with the Goldmine upgrade." + "\n" + + "" + "\n" + + "[Enquiro Survey Database Account]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Enquiro Survey Development Account]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ENSQL1]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENSQL1]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENSQL1]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSQL1" + "\n" + + "" + "\n" + + "[ENSQL1]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ENSQL2]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[OutOfMyGord.com Database]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: VADER" + "\n" + + "" + "\n" + + "[Sharepoint Services Database]" + "\n" + + "Group: Database Passwords" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Anti-Virus (Trend)]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: http://ensql1.enquiro.net/officescan/console/cgi/cgiChkMasterPwd.exe" + "\n" + + "" + "\n" + + "[Anti-Virus Uninstall]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Anti-Virus Unload]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[ENEXC1 Security Certificate]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Required for using Outlook over HTTP" + "\n" + + "" + "\n" + + "[Eye Tracking Study PDF]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: " + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: PDF Password" + "\n" + + "" + "\n" + + "[Google Account - Research Department]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to track web history for personalization" + "\n" + + "" + "\n" + + "[Google Account - Research Department]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to track web history for personalization" + "\n" + + "" + "\n" + + "[Goldmine Administrator]" + "\n" + + "Group: Miscellaneous" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Adding users to Goldmine" + "\n" + + "" + "\n" + + "[AIG Insurance]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Allstate Insurance Company]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Babyzone]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: Babyzone Google Sitemaps Login" + "\n" + + "" + "\n" + + "[Habeas]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Hanley Wood]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Kaboose Inc.]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Lesley University]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Plastic Products Mfg]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Project Server Extranet User]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[Rent Chalets]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Siemens Communications]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Sterling Commerce]" + "\n" + + "Group: Clients" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: ENSPS1" + "\n" + + "" + "\n" + + "[Enquiro]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: " + "\n" + + "" + "\n" + + "[clientlogs.enquiro.net]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 199.60.252.152" + "\n" + + "" + "\n" + + "[HrHero]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 199.60.252.152" + "\n" + + "" + "\n" + + "[Kaboose]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 199.60.252.152" + "\n" + + "" + "\n" + + "[Royal Roads University]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: 199.60.252.152" + "\n" + + "" + "\n" + + "[ftp.enquiro.com]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: " + "\n" + + "Password: 123456" + "\n" + + "Notes: TYRANUS (199.60.252.157)" + "\n" + + "" + "\n" + + "[Gene6 FTP Admistrator]" + "\n" + + "Group: FTP" + "\n" + + "User Name: ABC" + "\n" + + "URL: ensql2" + "\n" + + "Password: 123456" + "\n" + + "Notes: Used to create FTP folders for client use" + "\n" + + "" + "\n"; + + +//------------------------------------------------------------------------- +// +// This data is probably in the KeePassX export format that is not supported right now +// +testData['Jordan_Curzon_data'] = "" + + "*** Group: Financial ***" + "\n" + + "" + "\n" + + " Title: Allstate" + "\n" + + " Username: jones" + "\n" + + " Url: allstate.com" + "\n" + + " Password: bobfred" + "\n" + + " Comment:" + "\n" + + "" + "\n" + + " Title: NW Natural" + "\n" + + " Username: jones@gmail.com" + "\n" + + " Url: nwnatural.com" + "\n" + + " Password: bobfred" + "\n" + + " Comment: Account number: 097oe9u0098098" + "\n" + + "" + "\n"; + diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html new file mode 100644 index 0000000..a8a1317 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.html @@ -0,0 +1,59 @@ + + + + + Clipperz.KeePassExportProcessor - test + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js new file mode 100644 index 0000000..0ce4c91 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeePassExportProcessor.test.js @@ -0,0 +1,141 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +var tests = { + + //------------------------------------------------------------------------- + + 'test1_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("test1_test", someTestArgs); + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\n" }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\"}]", "first test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + deferredResult.callback(); + + return deferredResult; + }, + + 'test2_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("test2_test", someTestArgs); + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "second test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + deferredResult.callback(); + + return deferredResult; + }, + + 'test3_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("test3_test", someTestArgs); + deferredResult.addCallback(function(aResult) { return "[Gmail]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.gmail.com\nPassword: NHy08ZCMYsqUeLQCawR7\nNotes: Personal account\nwith some notes stored\non multiple lines\n\n[del.icio.us]\nGroup: General\nUserName: joe69\nURL: http://del.icio.us\nPassword: tS1cIEeqp5y0wkU\nNotes: social bookmarking site\n\n[Amazon]\nGroup: General\nUserName: jclipperz\nURL: http://www.amazon.com\nPassword: wvpkqNPIsqlI5g6XE9Tz\nNotes: The US online store\n\n[Paypal]\nGroup: General\nUserName: joeclipperz\nURL: http://www.paypal.com\nPassword: 24T4wIcvHnM28T3L\nNotes: Linked to my savings account\n\n[Technorati]\nGroup: General\nUserName: jclipperz\nURL: http://www.technorati.com\nPassword: UcVeNqF\nNotes: Blog ranking and searching\n\n[American Airlines]\nGroup: General\nUserName: joe.clipperz\nURL: http://www.aa.com\nPassword: AtrYbmi7lmSjR\nNotes: Adavantages card n. 795495\n" }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addCallback(function(aResult) { is(MochiKit.Base.serializeJSON(aResult), "[{\"Title\":\"Gmail\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.gmail.com\", \"Password\":\"NHy08ZCMYsqUeLQCawR7\", \"Notes\":\"Personal account\\nwith some notes stored\\non multiple lines\\n\"}, {\"Title\":\"del.icio.us\", \"Group\":\"General\", \"UserName\":\"joe69\", \"URL\":\"http://del.icio.us\", \"Password\":\"tS1cIEeqp5y0wkU\", \"Notes\":\"social bookmarking site\"}, {\"Title\":\"Amazon\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.amazon.com\", \"Password\":\"wvpkqNPIsqlI5g6XE9Tz\", \"Notes\":\"The US online store\"}, {\"Title\":\"Paypal\", \"Group\":\"General\", \"UserName\":\"joeclipperz\", \"URL\":\"http://www.paypal.com\", \"Password\":\"24T4wIcvHnM28T3L\", \"Notes\":\"Linked to my savings account\"}, {\"Title\":\"Technorati\", \"Group\":\"General\", \"UserName\":\"jclipperz\", \"URL\":\"http://www.technorati.com\", \"Password\":\"UcVeNqF\", \"Notes\":\"Blog ranking and searching\"}, {\"Title\":\"American Airlines\", \"Group\":\"General\", \"UserName\":\"joe.clipperz\", \"URL\":\"http://www.aa.com\", \"Password\":\"AtrYbmi7lmSjR\", \"Notes\":\"Adavantages card n. 795495\"}]", "third test"); }); + deferredResult.addErrback(function(anError) { is("ERROR", anError) }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'Barb_Newman_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("Barb_Newman_test", someTestArgs); +// deferredResult.addCallback(function () { return testData['Barb_Newman_data']; }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addBoth(function(aResult) { + SimpleTest.is(aResult.length, 121, "Barb's data contains 121 records"); + return aResult; + }); + deferredResult.addBoth(function(aResult) { + SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Domain Administration Account\", \"Group\":\"Windows\", \"User Name\":\"_ABC\", \"URL\":\"\", \"Password\":\"123456\", \"Notes\":\"\"}", "Barb's first record data matches"); + return aResult; + }); +// deferredResult.callback(); + deferredResult.callback(testData['Barb_Newman_data']); + + return deferredResult; + }, + + //------------------------------------------------------------------------- +/* + 'Jordan_Curzon_test': function (someTestArgs) { + var deferredResult; + var keePassProcessor; + + keePassProcessor = new Clipperz.KeePassExportProcessor(); + + deferredResult = new Clipperz.Async.Deferred("Jordan_Curzon_test", someTestArgs); + deferredResult.addCallback(function () { return testData['Jordan_Curzon_data']; }); + deferredResult.addMethod(keePassProcessor, 'deferredParse'); + deferredResult.addBoth(function(aResult) { + SimpleTest.is(aResult.length, 2, "Jordarn's data contains 2 records"); + return aResult; + }); + deferredResult.addBoth(function(aResult) { + SimpleTest.is(MochiKit.Base.serializeJSON(aResult[0]), "{\"Title\":\"Allstate\", \"Username\":\"jones\", \"Url\":\"allstate.com\", \"Password\":\"bobfred\", \"Comment\":\"\"}", "Barb's first record data matches"); + return aResult; + }); + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.KeyPassExportProcessor", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html new file mode 100644 index 0000000..f856f98 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.html @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js new file mode 100644 index 0000000..53cf5d3 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/KeyValueObjectStore.test.js @@ -0,0 +1,255 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +var tests = { + + //------------------------------------------------------------------------- + + 'simple_tests': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var objectStore; + + objectStore = new Clipperz.KeyValueObjectStore(); + + ok(objectStore != null, "created an object store"); + + objectStore.setValue('key', "value"); + is(objectStore.getValue('key'), "value", "can store and read a value to a simple key"); + + objectStore.setValue('key', "overwritten value"); + is(objectStore.getValue('key'), "overwritten value", "using the same key overwrites the previous value"); + + objectStore.setValue('record.keys', [1, 2, 3]); + is( + MochiKit.Base.compare(objectStore.getValue('record'), {'keys': [1,2,3]}), + 0, + "getting a partial key returns the whole content associate with that key" + ); + is( + MochiKit.Base.compare(objectStore.getValue('record.keys'), [1,2,3]), + 0, + "accessing data using a key.path return the matching content" + ); + is( + MochiKit.Base.compare(objectStore.getValue('record.keys.1'), 2), + 0, + "accessing data using a key.path return the matching content, even inside an array" + ); + + is( + objectStore.setValue('key', "value"), + "value", + "setting a value return the value itself, as a convenience to chain deferred methods" + ); + + is( + objectStore.getValue('not_set_key'), + null, + "accessing a previously undefined key will return null" + ); + is( + objectStore.getValue('record.not_set_key'), + null, + "accessing a previously undefined key will return null, even if part of the path is defined" + ); + is( + objectStore.getValue('not_set_path.not_set_key'), + null, + "accessing a previously undefined key will return null, even if using a completely undefined path" + ); + + objectStore.removeAllData(); + is( + objectStore.getValue('key'), + null, + "getting a value after a 'removeAllData' return no value" + ); + + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'simple_deferredGetOrSet_test': function () { + var deferredResult; + var objectStore; + var testValue; + + objectStore = new Clipperz.KeyValueObjectStore(); + testValue = "nifty test value"; + + deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_test", {trace:false}); + deferredResult.addMethod(objectStore, 'setValue', 'key', testValue); + deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue}); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store"); + }) + deferredResult.callback(); + }, + + //------------------------------------------------------------------------- + + 'deferredGetOrSet_test': function () { + var deferredResult; + var objectStore; + var testValue; + + objectStore = new Clipperz.KeyValueObjectStore(); + testValue = "nifty test value"; + + deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_test", {trace:false}); + deferredResult.addMethod(objectStore, 'setValue', 'key.path', testValue); + deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; }); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store"); + }) + deferredResult.callback(); + }, + + //------------------------------------------------------------------------- + + 'simple_deferredGetOrSet_withMissingValue_test': function () { + var deferredResult; + var objectStore; + var testValue; + + objectStore = new Clipperz.KeyValueObjectStore(); + testValue = "nifty test value"; + + deferredResult = new Clipperz.Async.Deferred("simple_deferredGetOrSet_withMissingValue_test", {trace:false}); + deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return testValue}); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult, testValue, "deferredGetOrSet works when accessing data already present on the object store"); + }) + deferredResult.callback(); + }, + + //------------------------------------------------------------------------- + + 'deferredGetOrSet_withMissingValue_test': function () { + var deferredResult; + var objectStore; + var testValue; + + objectStore = new Clipperz.KeyValueObjectStore(); + testValue = "nifty test value"; + + deferredResult = new Clipperz.Async.Deferred("deferredGetOrSet_withMissingValue_test", {trace:false}); + deferredResult.addMethod(objectStore, 'deferredGetOrSet', 'key', function() {return {'path': testValue}; }); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult['path'], testValue, "deferredGetOrSet works when accessing data already present on the object store"); + }) + deferredResult.callback(); + }, + + //------------------------------------------------------------------------- + + 'deleteObjectKey': function () { + var someValues; + var objectStore; + + someValues = { + 'key1': { + 'key1_1': "value 1.1", + 'key1_2': "value 1.2" + }, + 'key2': { + 'key2_1': { + 'key2.1.1': "value 2.1.1", + 'key2.1.2': "value 2.1.2" + }, + 'key2_2': "value 2.2" + } + } + + objectStore = new Clipperz.KeyValueObjectStore(); + objectStore.initWithValues(someValues); + objectStore.removeValue('key2.key2_1'); + + SimpleTest.is(objectStore.getValue('key1.key1_1'), "value 1.1", "The first element is still there"); + SimpleTest.is(objectStore.getValue('key1.key1_2'), "value 1.2", "The second element is still there"); + SimpleTest.is(objectStore.getValue('key2.key2_1'), null, "The deleted element is actually gone"); + SimpleTest.is(MochiKit.Base.keys(objectStore.getValue('key2')).length, 1, "Even the key is not stored anylonger"); + SimpleTest.is(objectStore.getValue('key2.key2_2'), "value 2.2", "The sibling of the deleted element is still there"); + }, + + //------------------------------------------------------------------------- + + 'accessDataUsingANumericKey': function () { + var someValues; + var objectStore; + + someValues = { + '1': "value 1", + '2': "value 2" + } + + objectStore = new Clipperz.KeyValueObjectStore(); + objectStore.initWithValues(someValues); + + SimpleTest.is(objectStore.getValue(1), "value 1", "The first element is accessed even using a numeric key"); + + objectStore.setValue(3, "value 3"); + SimpleTest.is(objectStore.getValue('3'), "value 3", "I can set the value using a numeric key and get it with a string key"); + }, + + //------------------------------------------------------------------------- + + 'isEmpty_test': function () { + var someValues; + var objectStore; + + someValues = { + '1': "value 1", + '2': "value 2" + } + + objectStore = new Clipperz.KeyValueObjectStore(); + SimpleTest.is(objectStore.isEmpty(), true, "A newly initialized KeyValueStore is empty"); + + objectStore.initWithValues(someValues); + SimpleTest.is(objectStore.isEmpty(), false, "Once the KeyValueStore is initialized with some values, it is no logner empty"); + + objectStore.removeAllData(); + SimpleTest.is(objectStore.isEmpty(), true, "A KeyValueStore is empty after invoking the 'removeAllData' method"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.KeyValueObjectStore", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html new file mode 100644 index 0000000..9bd344e --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.html @@ -0,0 +1,59 @@ + + + + + Clipperz.PM.BookmarkletProcessor - test + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js new file mode 100644 index 0000000..21776a3 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/BookmarkletProcessor.test.js @@ -0,0 +1,132 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +function testBookmarkletConfigurationString (aConfiguration, shouldFail, aMessage) { +// var configuration; + +//try { +// configuration = Clipperz.Base.evalJSON(aConfiguration); +//} catch (exception) { +// console.log("EXCEPTION", exception); +// throw exception; +//} + +//console.log("configuration", configuration); + + if (shouldFail == true) { + try { + Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration); + SimpleTest.ok(false, "vulnerability not caught - " + aMessage); + } catch(exception) { + SimpleTest.ok(true, "vulnerability correctly caught - " + aMessage); + } + } else { + try { + Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration(aConfiguration); + SimpleTest.ok(true, "configuration correctly checked - " + aMessage); + } catch(exception) { + SimpleTest.ok(false, "configuration wrongly caught as malicious - " + aMessage); +// console.log(exception); + } + } +} + +//############################################################################# + +var tests = { + + //------------------------------------------------------------------------- + + 'simpleAmazonConfiguration_test': function () { + var bookmarkletConfigurationString; + + bookmarkletConfigurationString = "{"+ + "\"page\": {\"title\": \"Sign In\"},\n" + + "\"form\": {" + + "\"attributes\": {" + + "\"action\": \"https://www.amazon.com/gp/flex/sign-in/select.html\",\n" + + "\"method\": \"post\"" + + "},\n" + + "\"inputs\": [" + + "{\"type\": \"hidden\",\n\"name\": \"path\",\n\"value\": \"/gp/yourstore\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"useRedirectOnSuccess\",\n\"value\": \"1\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"query\",\n\"value\": \"signIn=1&action=sign-out&useRedirectOnSuccess=1&path=/gp/yourstore&ref_=pd_irl_gw_r\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"mode\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"redirectProtocol\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"pageAction\",\n\"value\": \"/gp/yourstore\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"disableCorpSignUp\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"protocol\",\n\"value\": \"https\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"sessionId\",\n\"value\": \"105-1479357-7902864\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"referer\",\n\"value\": \"flex\"},\n" + + "{\"type\": \"text\",\n\"name\": \"email\",\n\"value\": \"\"},\n" + + "{\"type\": \"password\",\n\"name\": \"password\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"metadata1\",\n\"value\": \"Firefox 3.0.3 Mac\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"metadataf1\",\n\"value\": \"\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"metadata2\",\n\"value\": \"Default Plug-in Java Embedding Plugin 0.9.6.4 Shockwave Flash 90124RealPlayer Plugin QuickTime Plug-in 7.5.5 Flip4Mac Windows Media Plugin 2.2 4||1440-900-878-24-*-*-*\"},\n" + + "{\"type\": \"hidden\",\n\"name\": \"metadata3\",\n\"value\": \"timezone: -1 execution time: 3\"},\n" + + "{\"name\": \"action\",\n\"type\": \"radio\",\n\"options\": [" + + "{\"value\": \"new-user\",\n\"checked\": false},\n" + + "{\"value\": \"sign-in\",\n\"checked\": true}" + + "]}" + + "]" + + "},\n" + + "\"version\": \"0.2.3\"" + + "}"; + testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "regular Amazon.com configuration"); + }, + + //------------------------------------------------------------------------- + + 'hackedConfigurationWithXSSAttackVectorReadyToBeTriggeredWhenActivatingTheDirectLogin_test': function () { + var bookmarkletConfigurationString; + + bookmarkletConfigurationString = "{" + + "\"page\": {\"title\": \"Example Attack\"}," + + "\"form\": { " + + "\"attributes\": { " + + "\"action\": \"javascript:opener.document.body.innerHTML = 'hacked!';close();\", " + + "\"style\": \"-moz-binding:url('http://ha.ckers.org/xssmoz.xml#xss')\", " + + "\"method\": null " + + "}, " + + "\"inputs\": [" + + "{\"type\": \"text\", \"name\": \"username\", \"value\": \"\"}, " + + "{\"type\": \"password\", \"name\": \"password\", \"value\": \"\"}" + + "]" + + "}," + + "\"version\": \"0.2.3\" " + + "}"; + testBookmarkletConfigurationString(bookmarkletConfigurationString, false, "hacked configuration that is trying to inject a XSS attack vector. It should not fail, as it is responsability of the direct login to avoid triggering such attack vector"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +} + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.BookmarkletProcessor", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js new file mode 100644 index 0000000..9dec232 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.data.js @@ -0,0 +1,841 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +testData = { + + //------------------------------------------------------------------------- + + '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":"xuiWbu5GjkueQhyH6sKg5Cn9/CSsPIjYgbhaHmjgwnnB+GL8UO5u0uURxTY6tkG2HbaFRpYZwLnqUUulEkVY6iNqJajFI0qDtrKams11cF2y9LaAalbqyv6U7EUt76d666DkXW8tf88nJ4HYfyAhhPCJ0cw5053K9BAVPbQM7fMA4MYY29k45U3HcIKNZcNqMftCc+fZB+fmZl1g7mSbrXaZyagRkwWwTdJ6/ecVOSSVOkWpckAaQWzGhwbO6zVWLtR9XQReIQZV52TwDMnV5IYJHnlw0Uvv2ZCVSu/oMN2TneW5fcIwQ0x/SRe+n4Mklzucpvasza+ZhRaRUFS53kvmbfPFI5tXqB3Z1+9S7LRLr9Ws97suTQ6G5eW6jKT2vf65ehnQJtA/gW6uwH+3IAT7ukFxO1knaRf7dRJDLuIc4Xnh+bRDnZUqfA+B+04pp6r0OS9oysD35t/HydVFeHgoyMCbL4RzduZvmu7y16WhIznn0DEfRmrYmC68C+DNcAbxeiXU8v14PgGycIg1++0v44Qor/BXfP5JW4WnYjVLW3aXN3FgI5rPuN6PqTzMn7z+eF2V28GNss5pui1xIbR2bTECAAnaRQiaz98F1LH4z5kYG1ehmyjIOLqz1nAv3Kuo7+DZKaSez4nX1oWznbXEnwd6uguukcCGpQllZoHYso/fz07e6p/9fskXPmg7LnMMHApP7Vay6XPhXV/AG0imU7uREFLbgnw3305Ey9fslmD8qCzi8LlqNALEt1TFNpAukvqodkv8V1o6zqzYNMSKaqJV4E9dWMNDpOFFTKv1FuZjZfzyPwyCcePgP7vcJGtUSYqRJwl56Ia8UA+l3FBiX8DCSW3GkG+wusf7bZ5kV6lV5DQJTScIyFxWwcECJ5S8/2QaBPTopeLo2NuMmFwjUwhBGVrDkUmtqjfb6DSfr/dR6AbmraRLXrpd/KUN7wWgp5GdLUAKNT+RdsUc0mLsLF3oT+XshfgfsQqi/pDnX9x3QfH/WuRtoywAIE5APU8Rnl+1NGsEidzeYrBnryA8VRi9vxfhuaxe3+rx1ewB1pgVSERPLF+0MYtetug01yRSxEUYJgYHxQmfnmkCoz+kKCejdpYVqKC+RzhjIMytRbFXNmS0NpRmtBxZrSIskKXjjwjUeEzMAttqAPC4IK1kt5IK+5NZPNZbf2Y8qDsWcBNXfw5sh7pJymRwPCge+S5Jy69tadeSAWpX1YMuq+By/o2KWawpokstxmE6w2RNPFhKXtGPvukoDnpV9wDFgBcoNDJctDVdIPqNolLxn6Y57HoOid6CO2s+PqQcfZSEo7V70Rk6OQ+02M0ED0/4XGq6vflc6IlQ5LO1urRT4INrAQmWdulHnmLf+HESJAc0ZICO1T73aQVaGVVHFQxDMVgaTer1UXP1xxfB1tazfJme2aycsDM1WS5lTwMRRlvgwupkzS+YwGq+nB1QFsZknKgeoacGYxQjFo6EGvszitNU+sK4U/EeAShS/nM/96c10awZVwQnal5T9sYOO31mA2pxyI4TwxkgWw2wkj38msz+8afHvPlFlqlU0UiEm7hYMj5s4L08msIY+GVc7tGgaRYklsnRFUU6s0Kql8BLPkbpdM9RAoSczy4tlGlaBAPeC6ouPgyNf1+VRfVZnqlPF063ok1KcEbd6QqQHo0kgsUMLbtdPbe752dmUo64sZXkuDKISmFEwQjn3SN4K7OOg9sk5QEz1STMvm8pazq1yb+0CE1iad5e+HoNkrGT+5GSVX+YShiItu5eyZXjZ7m8GQ2HZTA7mgv6FwGSI6o0URPIRk/UgKMCggTSat2gf3oVk+aZvRCvkGg+ISjkEKk49tQasLDAfvVjdue2JHpM1UwNhTlurHNasqnwNEzFzhflsMuM+V7dv/6/3AiJBUSC9Oyd/kWRpt5DS0nW+BkBcL5eBoofyssj0tAqxpWe+nNwCL9ljVPdytQCHWp71xEqnDxSq1KWV7u57MmBSaGStdyWtShBvEQdHQIDpXz8HVfOWOxQKttNYkupVJcbYhHNicwLzc3Ox1TaT/trfkmTXT80XXfQA83Ls1VVsYKjHDBT5/bIOx3IzjS0KNl7C5E8BuggSL69t8ogHSOKwH9CugZje3vj0BuzhZsl65k1i/pNS+vYwOifv6BhhbgWS6D2s9+a1Xi5YLGLE/EvMlw82N+o/owUluZ2vhekbYJ0HkuyrL+18l0L5B+8iJS62LzdD+hC93cGxqD9RVQA37yxzpN33l2y6teSrypYU7j2hMVv1l0Y6JU0l5itSdWT3VmWyHzdKLYNFjpA2WY3UgvsWRTJfFYzFEYUu2V6OqY7HzUiuKcVTYwB5Ky2qESzmIFiLRv0E9E+fVoYTKjk8v2gDaNwKWq7AJTabgeNaQVif3lUdZ1oQerb6aRc7PBBBKBD1YE3S8+wJ6C4MIs+XIxuJvjhhbOav5Q+G9Tk251dlt44cWQ61sCPi5pCMAgzcwRH2+ZQOZeYslt6g4XS3TorVlHveIpQkBOPvzO3fUkfUQzKPZ1QXFIBZnTLLIcsV+L/tt5kep9ucrqUjNcREPODf+nM/mQlfLGT8SLU9r2zMFkMm4zXNWswWTsXO7zm1YEErAtyggWff6gM66wz1dnNMiVXMQ=="},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"jufmL1KVY0YBl8MSaL413hGtw12I/+sFnumcfeVku9RRMBmXaXCfE/vYnraxZyPxJxVS3qFRWDKsSGR3pScdACSwlBD+mzjifRn2SCfXWutD1/oJiqiMvq3YFzwyZJiXx+oS5u8DOTieQT9HZYt0pUmAod9QHiq2NAkueVjvRkZI1saRlWGtNXCaJIHwpuFJpHBDSD//6D9DYeTdVUeFEbej+4oNYpBCkyE1G2OL6q50YRBYp9yARRiy9juKHRWFvZiSeMGEJQS0f2gaP+xZkb9Z4qrfDgAZ1F7oDbPksr2SOYlSsm0bqa6c+7Wtopdo63Urf7Ze3Wg9n8TGBk6H88boseR8e3sHudlmtO1oLxcB9p3z/NTceF6SvWyJWTxHeMe6O72dZVmSnZlXhD/IJamRt13HLk3g05d8oXfrXM3iMhIGQ+EsXMxZfKdXlZpyYtjWD5tcQTKz7M5Qo3SFmdkwDu4jH5ke+bD8CeluDcMaHF6KHfdV8nEsmsjGwrH6lqSCT/9kBO5ETqUJKloOhJpFpNS/EN7nxjXF/QbqnUmWV4wngdyYmk9goNZNfZv7C2ouiyys55/QEfGsIsvEPPSfO670oJuncTyfFngFj2tdh2JpJ5vytuoRNLOm7XPM3hDCvZCOpUnjbm+jt4AvdOGU7ID8a2mtZFjb2noP5emAxTg6MO6f3+44eTkUcbCDskO5fe6jd0pTdODk21Ilp7WUjFwxEdJG8tRrGYpLooProJExamL7WShm/S/nhJL4+euW+1UIDjcZJA+a7aGdMSC63qBvrEsNyf57SDBk/o2eNJHs2sndCzgvK42IKGKcipq9D1Gyos9JQsA3My9ARMt68V/5FfzOkgPO6mblOsQMoTyQj/OCLzITEBfqA5IufhljSEkD3CLkfkeVwVf1NB2SsTPXJFChnynfsK7cMFy0O2XBNByCRTQDqBDBYo673tI1KTGnT4gLSAwCt96lq8UkEdt51jjkAJcvBXkbswuw3hvhtzLJ302hkN9CIHJrEN0oss5mWlxIxYrCyqE3ABME3FCR9r+V7exuIaQn6mdJTkMcRbYmVQQkexsROh2cdx8I/tuMN4ECWEAL948k9vEPZfgaQirWnrTtHoxLzNAUBDSQfzYXd8yr0T4vAHLnXaUalWPgLamJJ3eR+LDFcDQVvFkaomsF3RpOIS5fswTBFuRKGKEBSIINc9AyC4DtkSmDMTF2S0TgpnGdK94ZS8C/PM8WEsX738echa5qZG5qG0f+koOUUrbaORcDqaktCuDmsgFTYiUv1JxFskTvS/t/EM2Y0MEKVLZBsoG+4WXz4XEE0VJFoI9glaYll96WH/iMbaVXRnDwjyE62CAk/8DXIf//MJQVyO6ElFsvCrDfH03yLpCJhqwHv+mD5sRctVaq6Cp5Ts3bzdFeiLCX9rhSaqdG5AuMk4dCInlywxrsOvBfNaDBjX7NGCULri6px2T53FNiH6ineVjr9TfgY2uoMyevLiQsGd3GHS4wnxiUfIyz7/Yav5an4o82cHhMVOLvfKwF8C2dJQDg9woJ3ju1ha66UA2XGScJVd93w3OWco78+giXBE96R3CebxgaWQ5Zif6nI+FJnw6OipaRgd7EyrLrQTWadvTiYLfDknlsxFZd4XVs33/3xxF3RyoVsIFO7cpEX/BLVB69v+1TJvLdiyGwSl5FUKbrcrXycZ67uTKtHyAI/vrzwwoQxYV8e32xW86blEjH4pq/Zrijm1wGw7IrD9fYVgEO7nnWpE/ac85LrDaJpGOdZ+slcVWM6THHR9boKJGLtuc8V81gDVNtZ/f4Hx5YXZWKIIfpe57BybWejdQ8ZACWK+mXOGczyXJ88B4nIvaKnRlhSszQryAZzSqJry2k3t1v73BzL48TZWJ6yu1rFmqAUk2V5DCA4XnyHfPuiG8hZfTuu1YXQ+iBgbyDipTwozQqyTv3SxLBPTFxKZLuabMn7ZTo/kLXGfVO/2va58bv6kzW6WjwZ0D481N1Nyd1kZUw1lyxXklcAzZqaHUiIsy+/5DgV/qULYFqEBMNMA7QvBfRN4VZRlnNiemgzkBQXj+JGJOWZMz5cvss291rj1fAe91s10nkZoaddDrvfgfjTq6n9XLSyGSmnrIDMLVc9+YuDtuaQ4gwuiLG2X57Jzrc/Xy7jdZ82G1j+cfT/8Pvb40i1K9aid0Z3xl/tm7jBAqQ91Ehkbo6c8jUVPaQsRcfTumtsNf+Xa5PJmQtEGEPCUlGN6F7eFB5eOLXQFdsLRL1x+SzhS7k3aDri9sTMwYQij26AexwwzAPqcOOkkfbYf0lov5Gxx0LhsZAetDZCRFlxjDRDS8jE8dKBBXkWFazF8K2rdQXKNlclwezCEDBwUWhoJs/H5ndJ38MpSPfKo1YsVvlxi4QFyOTDPJIstCCvYnCjj1r7SrkRrbcuevITRTxD4FKgPCdsYFlGfhS1zWb23DWYWo6fPQ1/zlnN01gZStxsZKepB3NnxbTSjBgTSmzG6RzZajv6BtqivtvOa1hI2KZQtVGCDU2+NGmfbJ5TTJehYiTEPeBF9TfLRP9rktQTUngj2ohv+1TDL0jL3YWiSA9TJzYonsincEVy1aRUeGVazWF2Rrq2o4hCBp12BfuMGHOdVkg9rMXdusyl2y75YyEkcBNMz4zi8i1lVhjUg16rCR48uKJ9QO2KBbjoGTx13uxIXTR8ufXx6mW7iW3qVx+6k7BQGKlMo1G64O8HQ2UrboS/tCqlP0W+7XB2C3EaZMqfKeYcuzM4MLkM6CT2GKYmJPyevXLKE749BM8zRQUcrWieAxmyD+g0QQ4T1fl0RTNEFB1/0BIg3fQQHCLGUTahXwt0EluG9iNPVgmFwwBHybH6gmIEZ4xnD8I7QPwgYY3JF407NdLkHjOuXrP+GODGEvX49MMaUigUUO2fkdw9EJbaidhx6j1EsFpQrz4Lt/5sAu5c9B/365TXtnNnmaPkaFj1q+3ezVXUroimRqxZ9BMaTm7J1hjubO+Dxjb2QlR/UApvQ0ty8aZpmIrMi0xjfoodIMiH6IYdw3VRZSqup7irWWpnJhef2qqtcpoxdiYZaFyf5u2XpZqEnAJpTupqOg+qJN/7aQt6ZmP7POFPwUwzwAsfTYk2EwMlTVAXrawZZEYu2JZ4kIjazo1LgyuuWTieEuONnye8Hr9p70RjwWUdlErlPSCKKn6JRdsM2no13F3151cfgx8I02J9vDuiNa3vfJfmRnBOly5jq6Wlnm2rJN6YYQHwbikoq3lJvkX5ZANDRKFlMWKK42+fXLBuofAZShFt6xvlY384aYsv3EcR42GOLrgYPQy0a7lr/FS4mM2ErNwNYnCz/xTuPBjgXXplbAnyA3jpKdPN1EfUM1oA4kZjECmkXZOuyEQxrndS9eOGbPM6S131zpdWEw9dWSZdkSI34+OkLfAKf6W6z4G4Z+cMRrkYLHs+BavJOum4XTjyyXHIKhQiqz9mgEf+ulodXi+LNsbq1eCcGPWrGg+GNwN1SjJHZm78gidyrlEF6xuPCaZRvGQtk59nuJULOZWkC3Ns/EcFiAql8cu37Lp842fsHHeCVOq0e8ZII4TPg9HKPwDD4HLSg4frBzyeZwK0nN30C5ATCxWdL4Q60cKtZyIEM7Kn1a/vifsAbe019Ui3ovTOCYiTCAdOLaAL/NdpgWA/fDNOsTlPvnEYkq+4+bV3Wyye9ddxICD4TnC2yvXvjw4C/WnYYceJy5R4KamIJueEGIHGp22/0DSF3H4ji3QoUDiFB/H+CA8A2q9LO9q0NYcf2P5q2MfdJGu4bd49g68mltj35pRnGQaafflXY9VmMfrlAbBYfUnsKOb3DOUpq8asveE41/6WkGcXFIuSABcbBf0cHIfBn41wRWQhoCm/JL8pfqEZC/paBdFBRW4FjKkxhbg4BPvBL0aQyGGkU8eH8tr8nm4YN1HMFF/s3s8+9FPoBxPuXLoGSg7Rvdz+g=="},"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: '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', + 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' + } + } + } + } + } + } + }, + + //------------------------------------------------------------------------- + + 'syntaxFix': "" +} diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.html b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html new file mode 100644 index 0000000..181a3bf --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.html @@ -0,0 +1,71 @@ + + + + + Clipperz.PM.Connection - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js new file mode 100644 index 0000000..e4d0d15 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Connection.test.js @@ -0,0 +1,255 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'simple_tests': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var connection; + + SimpleTest.is(Clipperz.PM.Connection.communicationProtocol.versions['current'], Clipperz.PM.Connection.SRP['1.1'], "the current connection is 1.1"); + + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current'](); + SimpleTest.ok(connection != null, "can create a connection with the 'current' communication protocol"); + + SimpleTest.is(connection.proxy(), Clipperz.PM.Proxy.defaultProxy, "the connection uses the defaultProxy if no proxy is specified on the constructor"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'simpleProxy_tests': function () { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var connection; + var proxy; + + proxy = new Clipperz.PM.Proxy(); + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({proxy:proxy}); + SimpleTest.is(connection.proxy(), proxy, "the connection uses the specified proxy, when present"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'login_test': function () { + var deferredResult; + var connection; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, shouldCheckExpectedRequests:true}); + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ + proxy: proxy, + getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } + }); + + deferredResult = new Clipperz.Async.Deferred("login_tests", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "First handshake step", + functionName: 'handshake', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"), + version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), + parameters: { + C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"), + A: MochiKit.Base.operator.truth + } + } + } + }); + }); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "Second handshake step", + functionName: 'handshake', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"), + version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), + parameters: { + M1: MochiKit.Base.operator.truth + } + } + } + }); + }); + deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }) + deferredResult.addErrback(SimpleTest.ok, false, "the login procedure should succeed, and NOT going through this code path"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'login_with_toll_test': function () { + var deferredResult; + var connection; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:true}); + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ + proxy:proxy, + getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } + }); + + deferredResult = new Clipperz.Async.Deferred("login_with_toll_test", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "knock step", + functionName: 'knock', + parameters: { + requestType: MochiKit.Base.partial(MochiKit.Base.operator.eq, "CONNECT") + } + }); + }); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "First handshake step", + functionName: 'handshake', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "connect"), + version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), + parameters: { + C: MochiKit.Base.partial(MochiKit.Base.operator.eq, "f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674"), + A: MochiKit.Base.operator.truth + } + }, + toll: { + targetValue: MochiKit.Base.operator.truth, + toll: MochiKit.Base.operator.truth + } + } + }); + }); + deferredResult.addCallback(function() { + proxy.expectedRequests().unshift({ + name: "Second handshake step", + functionName: 'handshake', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "credentialCheck"), + version: MochiKit.Base.partial(MochiKit.Base.operator.eq, "0.2"), + parameters: { + M1: MochiKit.Base.operator.truth + } + }, + toll: { + targetValue: MochiKit.Base.operator.truth, + toll: MochiKit.Base.operator.truth + } + } + }); + }); + deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getUserDetails_test': function () { + var deferredResult; + var connection; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, shouldCheckExpectedRequests:false}); + connection = new Clipperz.PM.Connection.communicationProtocol.versions['current']({ + proxy:proxy, + getCredentialsFunction: function() { return {username:'joe', password:'clipperz'}; } + }); + + deferredResult = new Clipperz.Async.Deferred("getUserDetails_test", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(connection, 'login'/*, 'joe', 'clipperz'*/); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }); + deferredResult.addMethod(proxy, 'setShouldCheckExpectedRequests', [ + { + name: "Get user details", + functionName: 'message', + parameters: { + parameters: { + message: MochiKit.Base.partial(MochiKit.Base.operator.eq, "getUserDetails"), + srpSharedSecret: MochiKit.Base.operator.truth + }, + toll: { + targetValue: MochiKit.Base.operator.truth, + toll: MochiKit.Base.operator.truth + } + } + } + ]); + deferredResult.addMethod(connection, 'message', 'getUserDetails'); + deferredResult.addCallback(function(aResult) { + SimpleTest.ok(aResult['header'] != null, "got user details - header"); + SimpleTest.ok(aResult['statistics'] != null, "got user details - statistics"); + SimpleTest.ok(aResult['version'] == '0.3', "got user details - version"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.Connection", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html new file mode 100644 index 0000000..f95e994 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html @@ -0,0 +1,281 @@ + + + + + Clipperz.PM.Crypto - TEST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html new file mode 100644 index 0000000..094a58d --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_performanceEvaluation.html @@ -0,0 +1,153 @@ + + + + + Clipperz.PM.Crypt - Performance evaluation - TEST + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html new file mode 100644 index 0000000..f5b0a60 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Crypto_test.html @@ -0,0 +1,169 @@ + + + + + Clipperz.PM.Crypto - TEST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html new file mode 100644 index 0000000..e11adfd --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.html @@ -0,0 +1,103 @@ + + + + + Clipperz.PM.DataModel.DirectLogin - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js new file mode 100644 index 0000000..d385c8c --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLogin.test.js @@ -0,0 +1,195 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + +/* + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + ... + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + + + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + ... + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); // WEB PASSWORD (0) + deferredResult.addMethod(user, 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); // DIGG (1) + deferredResult.addMethod(user, 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); // SAP (2) + deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + DirectLogin references + - dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496 // Yahoo! Mail + - aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584 // (Yahoo! Groups) + - 6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f // (Flickr) + - a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e // (My Yahoo!) +*/ + //------------------------------------------------------------------------- + + 'editDirectLoginLabel_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); + deferredResult.addCallback(function (aDirectLogin) { + var innerDeferredResult; + var updatedLabel; + + updatedLabel = "updated Yahoo! Mail label"; + + innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_test ", someTestArgs); + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest("Yahoo! Mail", "The label of the selected direct login is correct."); + innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel); + + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data."); + + innerDeferredResult.addMethod(user, 'hasPendingChanges'); + innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes."); + +//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ >>>")}); + innerDeferredResult.addMethod(user, 'saveChanges'); +//innerDeferredResult.addCallback(function () { console.log("+_+_+_+_+_+_+_+_+_+_+_+ <<<")}); + innerDeferredResult.addMethod(user, 'hasPendingChanges'); + innerDeferredResult.addTest(false, "After saving changes there should be no pending changes left."); + + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even after committing data."); + + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginLabel_thanResetItToThePreviousValue_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); + deferredResult.addCallback(function (aDirectLogin) { + var innerDeferredResult; + var originalLabel; + var updatedLabel; + + originalLabel = "Yahoo! Mail"; + updatedLabel = "updated Yahoo! Mail label"; + + innerDeferredResult = new Clipperz.Async.Deferred("editDirectLoginLabel_thanResetItToThePreviousValue_test ", someTestArgs); + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest(originalLabel, "The label of the selected direct login is correct."); + innerDeferredResult.addMethod(aDirectLogin, 'setLabel', updatedLabel); + + innerDeferredResult.addMethod(aDirectLogin, 'label'); + innerDeferredResult.addTest(updatedLabel, "The DirectLogin returns the correct label even before committing data."); + + innerDeferredResult.addMethod(user, 'hasPendingChanges'); + innerDeferredResult.addTest(true, "When changing the label of a DirectLogin, the user should report pending changes [2]."); + + innerDeferredResult.addMethod(aDirectLogin, 'setLabel', originalLabel); + + innerDeferredResult.addMethod(aDirectLogin, 'hasPendingChanges'); + innerDeferredResult.addTest(false, "Restoring the original label, the directLogin should report no pending changes."); + + innerDeferredResult.addMethod(aDirectLogin.record(), 'hasPendingChanges'); + innerDeferredResult.addTest(false, "Restoring the original label, the record should report no pending changes."); + + innerDeferredResult.addMethod(user, 'hasPendingChanges'); + innerDeferredResult.addTest(false, "Restoring the original label, the user should report no pending changes."); + + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- +/* + 'bindingValues_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("DirectLogin.bindingValues_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496')); + deferredResult.addMethodcaller('bindingValues'); + deferredResult.addCallback(function (someBindingValues) { + SimpleTest.is(MochiKit.Base.keys(someBindingValues).length, 2, "there should be 2 bindings for this direct login"); + SimpleTest.is(someBindingValues['login'], 'joe.clipperz', "the login field should be filled with 'joe.clipperz'"); + SimpleTest.is(someBindingValues['passwd'], 'enfvDG1RxAsl', "the passwd field should be filled with 'enfvDG1RxAsl'"); + }) + + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.DirectLogin", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js new file mode 100644 index 0000000..6c0bf49 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/DirectLoginConfigurations.data.js @@ -0,0 +1,33 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +directLoginConfigurations = { + 'Yahoo! Mail': '{\n "page": {\n "title": "Yahoo! Mail"\n },\n "form": {\n "attributes": {\n "action": "https://login.yahoo.com/config/login?",\n "method": "post"\n },\n "inputs": [\n {\n "type": "hidden",\n "name": ".tries",\n "value": "1"\n },\n {\n "type": "hidden",\n "name": ".src",\n "value": "ym"\n },\n {\n "type": "hidden",\n "name": ".md5",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".hash",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".js",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".last",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "promo",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".intl",\n "value": "us"\n },\n {\n "type": "hidden",\n "name": ".bypass",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".partner",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".u",\n "value": "5gp62cl2vg3ov"\n },\n {\n "type": "hidden",\n "name": ".v",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".challenge",\n "value": "iBEY0IK6k3t9Uals32mrTos8s48p"\n },\n {\n "type": "hidden",\n "name": ".yplus",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".emailCode",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "pkg",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "stepid",\n "value": ""\n },\n {\n "type": "hidden",\n "name": ".ev",\n "value": ""\n },\n {\n "type": "hidden",\n "name": "hasMsgr",\n "value": "0"\n },\n {\n "type": "hidden",\n "name": ".chkP",\n "value": "Y"\n },\n {\n "type": "hidden",\n "name": ".done",\n "value": "http://mail.yahoo.com"\n },\n {\n "type": "hidden",\n "name": ".pd",\n "value": "ym_ver%3d0%26c="\n },\n {\n "type": "text",\n "name": "login",\n "value": ""\n },\n {\n "type": "password",\n "name": "passwd",\n "value": ""\n },\n {\n "type": "checkbox",\n "name": ".persistent",\n "value": "y"\n },\n {\n "type": "submit",\n "name": ".save",\n "value": "Sign In"\n }\n ]\n },\n "version": "0.2"\n}', + 'Parallels': '{"page": {"title": "Parallels Account"},\n"form": {"attributes": {"action": "https://www.parallels.com/account/",\n"method": "post"},\n"inputs": [{"type": "text",\n"name": "Email",\n"value": ""},\n{"type": "password",\n"name": "Password",\n"value": ""}]},\n"version": "0.2.3"}', + __syntaxFix__: "syntax fix" +}; \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html new file mode 100644 index 0000000..699c06d --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.html @@ -0,0 +1,66 @@ + + + + + Clipperz.PM.DataModel.EncryptedRemoteObject - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js new file mode 100644 index 0000000..0a4fe0c --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/EncryptedRemoteObject.test.js @@ -0,0 +1,225 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'simple_tests': function(someTestArgs) { + var deferredResult; + var encryptedRemoteObject; + + var key; + var version; + var rawData; + + key = "just a random key"; + version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; + rawData = "just a random text to encrypt"; + + encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'retrieveKeyFunction': MochiKit.Base.noop, + 'retrieveRemoteDataFunction': function () { return "--"}, + 'encryptedDataKeypath': '--', + 'encryptedVersionKeypath': '--' + }); + SimpleTest.ok(encryptedRemoteObject != null, "create an encryptedRemoteObject"); + + deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.test - simple_tests", [ + MochiKit.Base.method(encryptedRemoteObject, 'getRemoteData'), + function(aResult) { + SimpleTest.is(aResult, "--", "setting and getting serverData works"); + } + ], someTestArgs); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'decrypt_test': function (someTestArgs) { + var deferredResult; + var encryptedRemoteObject; + var key; + var version; + var rawData; + + key = "just a random key"; + version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; + rawData = "just a random text to encrypt"; + + encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key), + 'retrieveRemoteDataFunction': MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test ", [ + MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}), + function (someEncryptedData) { + return { + 'data': someEncryptedData, + 'version': version + } + } + ], someTestArgs)//, +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version' + }); + + deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs); + deferredResult.addMethod(encryptedRemoteObject, 'getDecryptedData'); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult, rawData, "encrypt and decrypt works"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getValue_test': function (someTestArgs) { + var deferredResult; + var encryptedRemoteObject; + var key; + var version; + var rawData; + + key = "just a random key"; + version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; + rawData = { + key1: 'value1', + key2: 'value2' + }; + + encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'reference': "testReference", + 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, key), + 'retrieveRemoteDataFunction': MochiKit.Base.partial(Clipperz.Async.callbacks, "EncryptedRemoteObject.test - decrypt_test ", [ + MochiKit.Base.partial(Clipperz.PM.Crypto.deferredEncrypt, {key:key, value:rawData, version:version}), + function (someEncryptedData) { + return { + 'data': someEncryptedData, + 'version': version + } + } + ], someTestArgs)//, +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version' + }); + + deferredResult = new Clipperz.Async.Deferred("decrypt_test", someTestArgs); + + deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); + deferredResult.addTest('value1', "getting 'key1' works"); + deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData'); + deferredResult.addTest(true, "After accessing a value, hasAnyCleanTextData returns false"); + + deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); + deferredResult.addTest(false, "if nothing has changed, the object should return not pending changes"); + + deferredResult.addMethod(encryptedRemoteObject, 'deleteAllCleanTextData'); + deferredResult.addMethod(encryptedRemoteObject, 'hasAnyCleanTextData'); + deferredResult.addTest(false, "After deleting all cleanTextData, hasAnyCleanTextData returns false"); + + deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); + deferredResult.addTest('value1', "getting 'key1' (also after a lock) works correctly"); + + deferredResult.addMethod(encryptedRemoteObject, 'setValue', 'key1', 'new value1'); + deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); + deferredResult.addTest('new value1', "after setting a new value, it is correctly returned"); + + deferredResult.addMethod(encryptedRemoteObject, 'values'); + deferredResult.addCallback(function (someValues) { + SimpleTest.is(someValues['key1'], 'new value1', "the value got straight from the objectStore is correct"); + }); + + deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); + deferredResult.addTest(true, "once a value has been changed, the object should return that there're some pending changes"); + + deferredResult.addMethod(encryptedRemoteObject, 'revertChanges'); + deferredResult.addMethod(encryptedRemoteObject, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting the changes should return the object to its initial state, without any peding changes"); + + deferredResult.addMethod(encryptedRemoteObject, 'getValue', 'key1'); + deferredResult.addTest('value1', "also the value of the changed item has been restored"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'encrypt_with_new_object_test': function (someTestArgs) { + var deferredResult; + var encryptedRemoteObject; + var key; +// var version; +// var rawData; + + key = "just a random key"; +// version = Clipperz.PM.Crypto.encryptingFunctions.currentVersion; +// rawData = "just a random text to encrypt"; + + encryptedRemoteObject = new Clipperz.PM.DataModel.EncryptedRemoteObject({ + 'retrieveRemoteDataFunction': MochiKit.Base.noop + }); + + encryptedRemoteObject.setValue('key1', "value1"); + encryptedRemoteObject.setValue('key2', "value2"); + encryptedRemoteObject.setValue('key3', "value3"); + + deferredResult = new Clipperz.Async.Deferred("encrypt_with_new_object_test", someTestArgs); + deferredResult.addMethod(encryptedRemoteObject, 'prepareRemoteDataWithKey', key); + deferredResult.addCallback(MochiKit.Base.itemgetter('data')); + deferredResult.collectResults({ + 'key': MochiKit.Base.partial(MochiKit.Async.succeed, key), + 'value': MochiKit.Async.succeed, + 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion) + }); + deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult['key1'], "value1", "encrypt and decrypt works for first element"); + SimpleTest.is(aResult['key2'], "value2", "encrypt and decrypt works for second element"); + SimpleTest.is(aResult['key3'], "value3", "encrypt and decrypt works for third element"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.EncryptedRemoteObject", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html new file mode 100644 index 0000000..a9bac22 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.html @@ -0,0 +1,105 @@ + + + + + Clipperz.PM.DataModel.User - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js new file mode 100644 index 0000000..0171714 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/OneTimePassword.test.js @@ -0,0 +1,198 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'isValidOneTimePasswordValue_test': function (someTestArgs) { + var otp; + var notOTP; + + otp = 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg'; + SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(otp), true, "isValidOneTimePasswordValue [expect true] - test 1"); + + notOTP = 'trustno1'; + SimpleTest.is(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue(notOTP), false, "isValidOneTimePasswordValue [expect false] - test 1"); + + return MochiKit.Async.succeed('done'); + }, + + //------------------------------------------------------------------------- + + 'loginUsingOtp_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var username; + var passphrase; + + username = "test"; + passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; // OTP + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("loginUsingOtp_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); + + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has one single card"); + + deferredResult.addMethod(user, 'getOneTimePasswords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has one OTP"); + + deferredResult.addMethod(user, 'getOneTimePasswords'); + deferredResult.addCallback(MochiKit.Base.itemgetter(0)); + deferredResult.addCallback(MochiKit.Base.methodcaller('status')); + deferredResult.addTest('USED', "The available OTP has been unsed to login, and should be marked accordingly"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.shouldFail("trying to login using the same OTP twice"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'changePassphraseAndLoginUsingOtp_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var user3; + var otp; + + otp = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; // OTP + + newPassphrase = 'tset'; + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return otp;}}); + + deferredResult = new Clipperz.Async.Deferred("changePassphraseAndLoginUsingOtp_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); + + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has only a single card"); + + deferredResult.addMethod(user, 'changePassphrase', newPassphrase); + deferredResult.addMethod(user, 'logout'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has oly a single card"); + deferredResult.addMethod(user2, 'logout'); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loginUsingOtpAndWrongUsername_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var username; + var wrongUsername; + var passphrase; + + username = "test"; + wrongUsername = "tset"; + passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; // OTP + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:wrongUsername, getPassphraseFunction:function () { return passphrase;}}); + user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("loginUsingOtpAndWrongUsername_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_with_otps']); + + deferredResult.addMethod(user, 'login'); + deferredResult.shouldFail("login in using the wrong username with the OTP should fail"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.shouldFail("trying to reuse the same OTP should fail, even if now it is used with the correct username"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loginUserWithAPassphraseLookingExactlyLikeAnOTP_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var username; + var passphrase; + + username = "otp_user"; + passphrase = "yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"; // passphrase + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("loginUserWithAPassphraseLookingExactlyLikeAnOTP_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['otp_user_test']); + + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has one single card"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.OneTimePassword", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html new file mode 100644 index 0000000..c349e0d --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.html @@ -0,0 +1,98 @@ + + + + + Clipperz.PM.DataModel.Record - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js new file mode 100644 index 0000000..7d024d9 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/Record.test.js @@ -0,0 +1,1285 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'recordUseOf_retrieveIndexDataFunction_and_getRemoteDataFunction_test': function (someTestArgs) { + var deferredResult; + var record; + +//console.log("#### new Clipperz.PM.DataModel.Record [5]"); + record = new Clipperz.PM.DataModel.Record({ + 'reference': '<<< record reference >>>', + 'retrieveKeyFunction': MochiKit.Base.noop, + 'retrieveRemoteDataFunction': function (aRecordReference) { + SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for encrypted data"); + return MochiKit.Async.succeed({ + // fake server payload + 'data': "#### fake encrypted data ####", + 'version': "0.x", + 'currentVersion': { + 'reference': "<<< fake record version reference >>>", + 'data': "#### fake encrypted data ####", + 'version': "0.x" + } + }); + }, + 'updateDate': "Thu, 10 May 2007 13:01:21 UTC", +// 'encryptedDataKeypath': 'data', +// 'encryptedVersionKeypath': 'version', + + 'retrieveIndexDataFunction': function (aRecordReference) { + SimpleTest.is(aRecordReference, '<<< record reference >>>', "Record correctly passes its record reference when asking for index data"); + return MochiKit.Async.succeed({ + key: '<< key >>', + label: '<< label >>', + notes: '<< notes >>' + }); + }, + 'updateIndexDataFunction': MochiKit.Base.noop + + }); + + deferredResult = new Clipperz.Async.Deferred("recordUseOf_retrieveIndexDataFunction_and_getEncryptedDataFunction_test", someTestArgs); + deferredResult.addMethod(record, 'label'); + deferredResult.addTest('<< label >>', "Record returns the right value for label"); + deferredResult.addMethod(record, 'notes'); + deferredResult.addTest('<< notes >>', "Record returns the right value for notes - even the legacy one, stored on the header"); + deferredResult.addMethod(record, 'getRemoteData'); + deferredResult.addCallback(Clipperz.Async.Test.isDeeply({ 'data': "#### fake encrypted data ####", 'version': "0.x", 'currentVersion': { 'reference': "<<< fake record version reference >>>", 'data': "#### fake encrypted data ####", 'version': "0.x" } }, "Record returns the expected encrypted data")); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'createRecordWithoutAllRequiredParameters_test': function (someTestArgs) { + var record; + + try { +//console.log("#### new Clipperz.PM.DataModel.Record [6]"); + record = new Clipperz.PM.DataModel.Record({reference:'--'}); + SimpleTest.ok(false, "creating a record without all parameters should raise an exception"); + } catch(exception) { +// SimpleTest.is(exception.name, "Clipperz.Base.exception.MandatoryParameter", "creating a record without all parameters raises an exception"); + SimpleTest.ok(/Clipperz\.Base\.exception\.MandatoryParameter.*/.test(exception.name), "creating a record without all parameters raises an exception"); + } + }, + + //------------------------------------------------------------------------- + + 'recordFromOldData_version_0.1_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var recordID; + +//console.log("#### new Clipperz.PM.DataModel.Record [7]"); +/* + record = new Clipperz.PM.DataModel.Record({ + 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', + 'retrieveKeyFunction': MochiKit.Base.partial(MochiKit.Async.succeed, 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6'), + 'retrieveRemoteDataFunction': MochiKit.Base.partial(MochiKit.Async.succeed, { + 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c', + 'version': '0.1', + 'currentVersion': { + 'reference': '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', + 'data': '4ec19a7093534e7dcf7c796b889283c6cec224b1895720ba3ff43ce091dc72c61fd5ea56def418ba3f15239f73228c6c8558585311f5e6673efe57482a1f9c9fe71e921576989eace671ec543685e3ad8f976bbfa4c2dbc629fab936c227d4fd4da3a1561ea79e553bae7b758ff91762572c1448a2d18bec797e12721238ef5ba18ddf1fba8ae773a8debe1040b3b158220aec6be9c7190687139f589a30d9c8887792fd7040e3c7cf3f9999fb9dde1f9f334d17c996996d538a7e374ac93135acafdaf5fce738a1702182897b63d2cb8e308b94156473cba63dcc557d17dcbdb55fcff63d9ba5edf68c42855052e34207d6fabe94fe024c3db616b45f494da42c62224d3897e320080072cc442d4212e7b1e8d5b3d9e3c25d48f4e7c37112ef4c6b2c0c8aff0bd3ce05694370e4378701463dde26c7c0322f8a9eb5a724106039b16b35050a9a9b5717b2eec803efa962b88b9655742f5e7b180ea567449671fb5a2ce563d8b47bc25705821938192eae420391c208182a788dd06fb6448b9858a4104a14efd7717671c65cd08fd979a4da7c01712bc5d4e949a10ef1ea65caf1f07cee34b063bab01bfb7a59047fef30c3059ea652f1c92b9e72aac515ac8851756703772e1fa05384ee7f0d5c7a3c', + 'version': '0.1' + } + + }), + + 'retrieveIndexDataFunction': MochiKit.Base.partial(MochiKit.Async.succeed, { +// 'key': 'e038652297f981d5ca917d88fa2c4c3251a12c0fa41bf7313a4d24a9738fe6c6', + 'label': '<< label >>', + 'notes': '<< notes >>' + }), + 'updateIndexDataFunction': MochiKit.Base.noop, + 'updateDate': 'Mon Oct 02 10:01:52 CEST 2006' + }); +*/ + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + recordID = "05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a"; + + deferredResult = new Clipperz.Async.Deferred("recordFromOldData_version_0.1_test", someTestArgs); + + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasAnyCleanTextData'); + deferredResult.addTest(false, "When first loaded, the record has no clean text data"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('label'); + deferredResult.addTest("Card encoded with an old algorithm", "Record returns the right value for label"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('notes'); + deferredResult.addTest("", "Record returns the right value for notes - even the legacy one, stored on the header"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasAnyCleanTextData'); + deferredResult.addTest(true, "After reading some values, the record has some clean text data"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 6, "the card has 6 fields"); + }); + deferredResult.callback(); + + return deferredResult; + + }, + + //------------------------------------------------------------------------- + + 'removeDirectLogin': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4) + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLogin", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('remove'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after saving there should be not any pending changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "after saving changes, the record should have only 3 direct logins"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "also reloading all the data with a new user, the direct logins should always be 3"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'removeDirectLoginAndRevertChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.removeDirectLoginAndRevertChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(22, "the user has 22 initially"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the selected record has 4 direct logins"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('remove'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "removing a direct login to a record should result in pending changes on the record"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after reverting the changes, the user should not have pending changes"); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(22, "after reverting the changes, the user should still have 22 direct logins"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "after reverting the changes, the record should still have 4 direct logins"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addDirectLoginAndRevertChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4) + var directLoginReference; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.setValue('record'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('createNewDirectLogin'); + deferredResult.setValue('directLogin'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setLabel', "New direct login"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}'); + + deferredResult.addMethod(user, 'revertChanges'); +//deferredResult.addCallback(function () { console.log("###################################"); }); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "after reverting the changes, the record should NOT have pending changes"); + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.setValue('record_2'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the record, when reloaded from scratch, has still 4 direct logins"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addDirectLoginAndSaveChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4) + var directLoginReference; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndSaveChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasAnyCleanTextData'); + deferredResult.addTest(false, "When first loaded, the record has no clean text data [2]"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.setValue('record'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the selected record has 4 direct logins"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasAnyCleanTextData'); + deferredResult.addTest(false, "Still no clean text data is stored on the record, as all accessed data are stored on the index"); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(true, "the user has some clean text data"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('createNewDirectLogin'); + deferredResult.setValue('directLogin'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('label'); + deferredResult.addTest(null, "The label of a initially created direct login is empty"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bookmarkletConfiguration'); + deferredResult.addTest('', "The bookmaraklet configuration of a initially created direct login is empty"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(Clipperz.Async.Test.isDeeply({}, "The bindings of a initially created direct login is empty")); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setLabel', "New direct login"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setBookmarkletConfiguration', directLoginConfigurations['Parallels']); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('Email')); + deferredResult.addMethodcaller('setFieldKey', '4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9'); // "userID" + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('Password')); + deferredResult.addMethodcaller('setFieldKey', 'ef2dee54322bf401540657d469e158a50e9228bc0a192a31d2e3ee56a77e565b'); // "password" + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('favicon'), + deferredResult.addTest('http://www.parallels.com/favicon.ico', "the original favicon is the expected one"), + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('reference'); + deferredResult.addCallback(function (aReference) { + directLoginReference = aReference; + }); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "after adding a new direct login, the user should have pending changes"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "after adding a new direct login, the record should have pending changes"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(5, "after adding a new direct login, the record has now 5 direct logins"); + + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after saving the changes, the user should NOT have pending changes"); + + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.setValue('record_2'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(5, "the record, when reloaded from scratch, has still 5 direct logins"); + + deferredResult.getValue('record_2'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.itemgetter('4')); // TODO: accessing directLogins by index is not really nice + deferredResult.setValue('directLogin_2'); + deferredResult.addMethodcaller('label'); + deferredResult.addTest('New direct login', "The label of the direct login has been correctly saved"); + + deferredResult.getValue('directLogin_2'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('Email')); + deferredResult.addMethodcaller('field'); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('joe.clipperz', "The value bound to the direct login 'Email' field is correct"); + + deferredResult.getValue('directLogin_2'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('Password')); + deferredResult.addMethodcaller('field'); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('enfvDG1RxAsl', "The value bound to the direct login 'Password' field is correct"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'readDirectLoginAttributes': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e'; + var directLoginID = '03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.readDirectLoginAttributes", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c')); + deferredResult.setValue('directLogin'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('inputs'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(13, "Amazon direct login has 13 inputs"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('inputs'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.filter, MochiKit.Base.methodcaller('needsFormValue')); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "Amazon direct login has 1 field needing a form value"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('inputs'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.filter, MochiKit.Base.methodcaller('needsBinding')); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(2, "Amazon direct login has 2 field needing a binding"); + + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(2, "Amazon direct login has just two bindings"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('email')); + deferredResult.addMethodcaller('fieldKey'); + deferredResult.addTest('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2', "Amazon direct login 'email' binding points to the correct field"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('bindings'); + deferredResult.addCallback(MochiKit.Base.itemgetter('password')); + deferredResult.setValue('passwordBinding'); + deferredResult.addMethodcaller('fieldKey'); + deferredResult.addTest('01e4bb6dcf054f312c535de8160bcf50bdccd664bdc05721b10d4e69583765f7', "Amazon direct login 'password' binding points to the correct field"); + + deferredResult.getValue('passwordBinding'); + deferredResult.addMethodcaller('field'); + deferredResult.addMethodcaller('label'); + deferredResult.addTest('password', "Amazon direct login 'password' binding points to the 'password' field"); + + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "Amazon direct login has just one formValue"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('action')); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('sign-in', "Amazon direct 'action' formValue is set to 'sign-in'"); + + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginLabel': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var oldLabel; + var newLabel; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + oldLabel = "Yahoo! Mail"; + newLabel = "YAHOO! Mail"; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginLabel", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('label'); + deferredResult.addTest(oldLabel, "the current label of the direct login"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('setLabel', newLabel); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the record itself"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the directLogin itself"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginFormValueAndRestoreChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginFormValueAndRestoreChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.setValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent')); + deferredResult.addMethodcaller('value'); + deferredResult.addTest(null, "original formValue value matches"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent')) + deferredResult.addMethodcaller('setValue', 'y'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent')) + deferredResult.addMethodcaller('value'); + deferredResult.addTest('y', "the newly set value is retained"); + + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the record itself"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the label of a direct login should trigger some changes also on the directLogin itself"); + + deferredResult.addMethod(user, 'revertChanges'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('formValues'); + deferredResult.addCallback(MochiKit.Base.itemgetter('.persistent')) + deferredResult.addMethodcaller('value'); + deferredResult.addTest(null, "the old formValue value is correctly restored"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginConfigurationAndRevertChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfigurationAndRevertChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + + deferredResult.addCallback(function (aDirectLogin) { +// var newBookmarkletConfiguration; + +// newBookmarkletConfiguration = '{\n \"page\": {\n \"title\": \"Yahoo! Mail\"\n },\n \"form\": {\n \"attributes\": {\n \"action\": \"https://login.yahoo.com/config/login?\",\n \"method\": \"post\"\n },\n \"inputs\": [\n {\n \"type\": \"text\",\n \"name\": \"login\",\n \"value\": \"\"\n },\n {\n \"type\": \"password\",\n \"name\": \"passwd\",\n \"value\": \"\"\n },\n {\n \"type\": \"checkbox\",\n \"name\": \".persistent\",\n \"value\": \"y\"\n }\n ]\n },\n \"version\": \"0.2\"\n}'; + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration [inner call]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration"), + + MochiKit.Base.method(aDirectLogin, 'favicon'), + Clipperz.Async.Test.is('http://login.yahoo.com/favicon.ico', "the original favicon is the expected one"), + + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', directLoginConfigurations['Parallels']), + + MochiKit.Base.method(aDirectLogin, 'favicon'), + Clipperz.Async.Test.is('http://login.yahoo.com/favicon.ico', "the original favicon is the expected one"), + + MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'), + Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes on the direct login"), + MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'), + Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes also on the record"), + MochiKit.Base.method(user, 'hasPendingChanges'), + Clipperz.Async.Test.ok("changing the configuration should trigger the pending changes also on the user"), + + MochiKit.Base.method(aDirectLogin, 'revertChanges'), + + MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login"), + MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record"), + MochiKit.Base.method(user, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user"), + + MochiKit.Base.noop + ], someTestArgs); + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var newBookmarkletConfiguration; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + newBookmarkletConfiguration = '{\n \"page\": {\n \"title\": \"Yahoo! Mail\"\n },\n \"form\": {\n \"attributes\": {\n \"action\": \"https://login.yahoo.com/config/login?\",\n \"method\": \"post\"\n },\n \"inputs\": [\n {\n \"type\": \"text\",\n \"name\": \"login\",\n \"value\": \"\"\n },\n {\n \"type\": \"password\",\n \"name\": \"passwd\",\n \"value\": \"\"\n },\n {\n \"type\": \"checkbox\",\n \"name\": \".persistent\",\n \"value\": \"y\"\n }\n ]\n },\n \"version\": \"0.2\"\n}'; + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addCallback(function (aDirectLogin) { + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges [inner call 1]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration (1)"), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(26, "The original direct login had 26 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The original direct login had 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + MochiKit.Base.methodcaller('field'), + MochiKit.Base.methodcaller('reference'), + Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the original 'login' direct login binding points to the correct field"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(1, "The original direct login had 1 form values"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('type'), + Clipperz.Async.Test.is('checkbox', "the original formValue has the expected type"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is(null, "the original formValue is correct (1)"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('setValue', 'y'), + + + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', newBookmarkletConfiguration), + MochiKit.Base.method(user, 'saveChanges'), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + MochiKit.Base.methodcaller('field'), + MochiKit.Base.methodcaller('reference'), + Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the 'login' binding is still valid after the new configuration is set"), + + MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login (2)"), + MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record (2)"), + MochiKit.Base.method(user, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user (2)"), + + MochiKit.Base.noop + ], someTestArgs); + }) + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addCallback(function (aDirectLogin) { + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_keepingTheSameStructure_AndSaveChanges [inner call 2]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Async.Test.is(newBookmarkletConfiguration, "the direct login has the new bookmarkletConfiguration even after being reloaded"), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(3, "The new direct login has 3 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new direct login had 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + MochiKit.Base.methodcaller('field'), + MochiKit.Base.methodcaller('reference'), + Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the new 'login' direct login binding still points to the correct field"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(1, "The new direct login had 1 form values (1)"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is(null, "the formValue is still correctly set"), + + MochiKit.Base.noop + ], someTestArgs); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editDirectLoginConfiguration_changingTheStructure_AndSaveChanges': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + var directLoginID = 'dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addCallback(function (aDirectLogin) { + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges [inner call 1]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Async.Test.is(directLoginConfigurations['Yahoo! Mail'], "the current bookmarkletConfiguration (2)"), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(26, "The original direct login had 26 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The original direct login had 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + MochiKit.Base.methodcaller('field'), + MochiKit.Base.methodcaller('reference'), + Clipperz.Async.Test.is('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9', "the original 'login' direct login binding points to the correct field"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(1, "The original direct login had 1 form values"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('.persistent'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is(null, "the original formValue is correct (2)"), + + + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', directLoginConfigurations['Parallels']), + MochiKit.Base.method(user, 'saveChanges'), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new direct login has 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(0, "The new direct login has no form values"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new direct login has 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + Clipperz.Async.Test.is(null, "the 'login' binding should not exist within the new configuration"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('passwd'), + Clipperz.Async.Test.is(null, "the 'passwd' binding should not exist within the new configuration"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('Email'), + Clipperz.Async.Test.ok("the 'Email' binding should exist within the new configuration"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('Password'), + Clipperz.Async.Test.ok("the 'Password' binding should exist within the new configuration"), + + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('Email'), + MochiKit.Base.methodcaller('field'), + Clipperz.Async.Test.is(null, "the 'Email' binding should not point to any field, yet"), + + + MochiKit.Base.method(aDirectLogin, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes on the direct login (2)"), + MochiKit.Base.method(aDirectLogin.record(), 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the record (2)"), + MochiKit.Base.method(user, 'hasPendingChanges'), + Clipperz.Async.Test.fail("reverting changes should reset pending changes also on the user (2)"), + + MochiKit.Base.noop + ], someTestArgs); + }) + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter(directLoginID)); + deferredResult.addCallback(function (aDirectLogin) { + return Clipperz.Async.callbacks("Record.test.editDirectLoginConfiguration_changingTheStructure_AndSaveChanges [inner call 2]", [ + MochiKit.Base.method(aDirectLogin, 'bookmarkletConfiguration'), + Clipperz.Base.evalJSON, + MochiKit.Base.itemgetter('form'), + Clipperz.Async.Test.isDeeply(Clipperz.Base.evalJSON(directLoginConfigurations['Parallels'])['form'], "the direct login has the new bookmarkletConfiguration even after being reloaded"), + + MochiKit.Base.method(aDirectLogin, 'inputs'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new -reloaded- direct login has 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new direct login had 2 inputs"), + + MochiKit.Base.method(aDirectLogin, 'bindings'), + MochiKit.Base.itemgetter('login'), + Clipperz.Async.Test.is(null, "the 'login' binding should not exist within the new configuration"), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.keys, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(0, "The new direct login has no form values (2)"), + + MochiKit.Base.noop + ], someTestArgs); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editFieldValueAndRestoreIt': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editValueAndRestoreIt", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9')); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('joe.clipperz', "the current field value is 'joe.clipperz'"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9')); + deferredResult.addMethodcaller('setValue', 'fake.clipperz'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the value of a field should trigger pending changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9')); + deferredResult.addMethodcaller('setValue', 'joe.clipperz'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "restoring the value of a field should revert pending changes"); + + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'accessFieldValues': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.accessFieldValues", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fieldWithLabel', 'userID'); + deferredResult.addMethodcaller('value'); + deferredResult.addTest('joe.clipperz', "the current field value is 'joe.clipperz'"); + + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editFieldValueAndSaveIt': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + + var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e'; + var passwordFieldID = '01e4bb6dcf054f312c535de8160bcf50bdccd664bdc05721b10d4e69583765f7'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editValueAndRestoreIt", someTestArgs); +// deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('getVersions'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(5, "the selected record has 5 versions"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID)); + deferredResult.collectResults({ + 'label': MochiKit.Base.methodcaller('label'), + 'value': MochiKit.Base.methodcaller('value') + }); + deferredResult.addTest({'label': 'password', 'value': 'HRRd7ycaFVG6'}, "the current field label and value match", true); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID)); + deferredResult.addMethodcaller('setValue', '<>'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "changing the value of a field should trigger pending changes"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after saving, there should be no pending changes"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('getVersions'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(6, "the selected record, after saving a new version, has now 6 versions"); + + deferredResult.addMethod(user2, 'login'); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('getVersions'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(6, "the selected record - reloaded from the db - has 6 versions"); + + deferredResult.addMethod(user2, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter(passwordFieldID)); + deferredResult.collectResults({ + 'label': MochiKit.Base.methodcaller('label'), + 'value': MochiKit.Base.methodcaller('value') + }); + deferredResult.addTest({'label': 'password', 'value': '<>'}, "the current field label and value match", true); + +/* +deferredResult.addCallback(function (aValue) { console.log("FIELDS", aValue); return aValue}); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.itemgetter('4cfaf1e782086e7527bd0e0cc82b67eb773e8157ad0c5babe516f7bc945a02a9')); + deferredResult.addMethodcaller('setValue', 'joe.clipperz'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "restoring the value of a field should revert pending changes"); +*/ + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editNotesAndRestoreIt': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.editNotesAndRestoreIt", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('notes'); + deferredResult.addTest('', "the current note is the empty string even if nothing is set on the record"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('setNotes', ''); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "setting notes to an empty string should be the same has not having the notes altogether"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loadAllRecordVersions': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + var recordID = '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.loadAllRecordVersions", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_multipleRecordVersions_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('label'); + deferredResult.addTest('Amazon.com', "the selected record is the expected one"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('getVersions'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(5, "the 'Amazon' record has 5 versions"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('getCurrentRecordVersion'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "the current version of 'Amazon' record has 3 fields"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'createDirectLoginAndDeleteItAfterward': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var recordID = 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'; // YAHOO (4) + var directLoginReference; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:false, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("Record.test.addDirectLoginAndRevertChanges", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.setValue('record'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.keys); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "the record, when initially loaded, has 4 direct logins"); + + deferredResult.getValue('record'); + deferredResult.addMethodcaller('createNewDirectLogin'); + deferredResult.setValue('directLogin'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setLabel', "New direct login"); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('setBookmarkletConfiguration', '{"page": {"title": "Parallels Account"}, "form": {"attributes": {"action": "https://www.parallels.com/account/", "method": "post"}, "inputs": [{"type": "text", "name": "Email", "value": ""}, {"type": "password", "name": "Password", "value": ""}]}, "version": "0.2.3"}'); + + deferredResult.getValue('directLogin'); + deferredResult.addMethodcaller('remove'); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "after reverting the changes, the user should NOT have pending changes"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.Record", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js new file mode 100644 index 0000000..5684dbd --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.js @@ -0,0 +1,1941 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +testData = { + + //----------------------------------------------------------------------------- + + 'simpleLogin_001': function () { return { + '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': function () { return { + 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: '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', + 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: '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', + 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': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': function () { return { + 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': function () { return { + data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+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': function () { return { + 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' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- + + 'test_test_someExtraOldData': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': { + s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460', + v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a":"0"}, "data":"3iVejXl+Wnh1P1HeNXhuNswKZezHtSDEnMVPhtFmF+5qimM4vXvQ+8hTO398SktE18V+lTxzQBLrLjMfZBLIaq1rszO6CVi+Zz2+A4jC9jOkjqlHlMIQMxF0jwvTr2fRQSYJIT086H23LVH79Pdik+E/XmQCMyX5oPrm8xI3TnHmb02GDy3uEYTOodIw"}, "directLogins":{"index":{}, "data":"zxt4pdoEyLS2Z7F4GuHsR2Js"}, "preferences":{"data":"/nCI2oM+0mskwEBYj+ghKgvI"}, "oneTimePasswords":{"data":"OxUue8AceRz1qmwkj/c0V91x"}, "version":"0.1"}', + statistics: 'rGwA4ZUPNmYKzQCzLpstvcos', + userDetailsVersion: '0.3', + records: { + '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a': { + data: '1eab9775e41984618f366a58f3de6cd9d72725da399ade71071f83d3126552d95487437b1a6fc87cdb25b47d35097604ed23f7dd2b54bd71982eda7cac3e19e9fae5b1d8c52806d6a860a35e023d525bf0e43ef459901da8d819789031a80cf8ee4aabc0e8fd0a051a6b9a23e4e7151da900acb710439a5b11477259f464dbf38a6327adcc9dfd7ab7808ba7c6d26a39bc678da394083652bbbdfe382f32ff3a92a31697b72e83f1534e72e7af7b316137d60d597b80649fe11dd506f600315543c39bd447a884218d5ed8746102a95587dbc844f3437a7f057e26a311078a2fe508613894384c6b120e0b74444770dedc636930a5db17e39a55c79da36f44222ef7cc0d3060deccef7cfce9d4454fd3ab4f8e19e949a9cc208e915e29b24a6cd9c0ba01a84ed3c3d29aad374828c4f7174e51d5949799d29474f9d0e0ff421412225492926252c5c28859fd1945fe25', + version: '0.1', + creationDate: 'Mon Oct 02 10:01:52 CEST 2006', + updateDate: 'Mon Oct 02 10:01:52 CEST 2006', + accessDate: 'Sun May 24 21:33:48 CEST 2009', + currentVersion: '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a', + versions: { + '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a': { + header: '####', + data: '1eab9775e41984618f366a58f3de6cd9d72725da399ade71071f83d3126552d95487437b1a6fc87cdb25b47d35097604ed23f7dd2b54bd71982eda7cac3e19e9fae5b1d8c52806d6a860a35e023d525bf0e43ef459901da8d819789031a80cf8ee4aabc0e8fd0a051a6b9a23e4e7151da900acb710439a5b11477259f464dbf38a6327adcc9dfd7ab7808ba7c6d26a39bc678da394083652bbbdfe382f32ff3a92a31697b72e83f1534e72e7af7b316137d60d597b80649fe11dd506f600315543c39bd447a884218d5ed8746102a95587dbc844f3437a7f057e26a311078a2fe508613894384c6b120e0b74444770dedc636930a5db17e39a55c79da36f44222ef7cc0d3060deccef7cfce9d4454fd3ab4f8e19e949a9cc208e915e29b24a6cd9c0ba01a84ed3c3d29aad374828c4f7174e51d5949799d29474f9d0e0ff421412225492926252c5c28859fd1945fe25', + version: '0.1', + creationDate: 'Mon Oct 02 10:01:52 CEST 2006', + updateDate: 'Mon Oct 02 10:01:52 CEST 2006', + accessDate: 'Sun May 24 21:33:48 CEST 2009' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_with_preferences_and_OTPs_data': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { + s: '5f7dca20b7bc610a966ff3611cd8d6bcb5c5782d810123fcadf7155757ea39cd', + v: '100000924a0b2bef390c27b2f5f379ab1a557e8b6c2d4ce5ef57e983d5c3ca49b', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"a92c1ab3df0677f63da3cd1fdcec440fe3763e072e1035f8455672a97344a6bd":"0","cdc4624c921b8d99918c3cab5264b5e6de39df30ed167f504bc0a2c612404d5d":"1","6a17bd6b1bd576b99b678dfdac7da04e79402fc542055197017d3e586f6e8f38":"2","9ea260fcadc1ae2bbb8545c32035dc55499f715d005fbec71179600b50aa907a":"3","c0e76e60e08faa3ffa9d859ed869ba3cf3b42becc9478d45ac94cae6c004cc24":"4","5c5fed5764090b8c83435acbc22db01faae889c3154d51d502a3dc532c8709da":"5","97291f9d95cd97d089f940e5a4a674b7c33b06637337d3722010b528ab1fe34a":"6","6b147cfb119d690204cebb33ac047861a74504c87501432d914e07008ff3cc3a":"7","5d2b04a29a8af43562b1e307c416d9590ff55e370d9b542dc1e58c1e30127359":"8","52d2d8c69839e61f07b55c3ef496177e86b9ff35d27ddf4736bbe1907b30227a":"9","de7ce7e545acd2739d5d2d00b04f889fec7acc2229082a7a678ca050e2fdd3a0":"10","44d85d696125c6fa75e791b895359a31fdbdaec3303e286d09a484c0ea4a6558":"11","98af9721614f0d2f03d89ea5eb8930b7f1bee6a55a8e81f0eabe964016a930e3":"12","3c735070f699188a0813489b3fde68e9a7bf25f81d78e98689b81dee364eb013":"13","608adeba618077d125f0b489ef28fc7e3b1ba4fc2baeb01a3a1fc5f568578791":"14","35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b":"15","c742849667f8001483c1e6d3d388ae9d02a2e3561a1be7b1866b62a356b72b91":"16","2b58e7cdf7c90594d330ca9636565dfd1ef2e28bb49d16dae94335450c496b2b":"19","aa5a54aeeb4f7926e4d0b469207812e5384a4e00acfe9248dee45e939dc58b42":"10"},"data":"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"},"directLogins":{"index":{"03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"0","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"1","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"2","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"3","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"4","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"5","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"6","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"7","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"8","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"9","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"10","61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"11","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"12","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"13","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"14","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"15","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"16","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"17","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"18","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"19","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"20","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"21"},"data":"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"},"preferences":{"data":"pcQa/VkZWvrLv88k/npaOssWdQafXF9zJS+/DjM6MZwsUimSlhedy2pWLvrXp/TJ0ws7Pef1CbVmoxHJYyT1x7Eon7y0qy/cf483h4M="},"oneTimePasswords":{"data":"lyRIfuaIli6Zs4awYtZWI9JgUxQluHa+hxopJ4ADzlXfY7vTv5Iuxtmy1JviMKcGT+xge69tkrDBccydict+biWRPoZFEuR/V7tLMNndQBSdR54usAJ0e+obc6jDM0u38TpyMit0W3f3CL58lV7VkNUQgt6jEclKPxnKLMCqLOTNqoPTDNDMFJdlWVXFVeh+TDG02rarglHzIKd1lox9h/j+Ty4s04vjhISdlE1dNiQ2LqTZ3M2xv2Lg/kH9LBWMryCKmWpMI7IiD+S+eBnyq57EdwrqQi/3p6E34NcuJVJRnLBjnVAMoGkhU/vMg47iLcZXF9obP+oHYUg9mIKO2NNr/OYA7UIQ9lEHXWqs1XZmvnW4ORrzqQNnrXaO5/nWjYO93oG/PLGlJ9G/Tf/zsc2BAp3KJSwILoNS+xWckUydT7gickZqN+JSBXj5W1LZxJ60EY3PBIyE3i37yzho7nP4n30G8kGv5PgSA5BzpKj8/EiPFF3JFJVB5oDcwdeDgvDRsCOGUSMVWcWP1MfDsKHsRkMdGwW8kjFB65/jj3VTGaS5tYtyYVIhr49Mq3I/hUVBk7fcDQQM8DMYqj2EVfDoYAnA0BT+BAFRJ2bfez8Zj/vgW8GOwmsvfaha5YnneYVFg6w8Elw0cwJh3uKGHKCuXwXpe3h9LHSpA8RB95m/dvdoRQg9pg5l2y6oqFlMjBd+3qrpDWG68VZoz7pes0WHMVsNSmJQs+yJ8XfiVnRl27O8/8v4DmhRUb/GhuBSu3pew2YIPVWXEGq9C4nJlZhWAeT1pF49Gv+2bDzRI2R8fJykNXbStn1DO1I6bF01yECRgfzc830T6VBdSbUjpmmMMq67ZS0XVPvO8ZErmQcM6ua0RlttgMdXwNrO0pQ11TKNtGD6k72ud5MYDOYOtgMq5OFdpPc6A/b44mJ1Dim/8j4ETnRM53gl+FU43kbDGBkFu2Q5UGTmza/FctczfHqGEhthyBEE834FDFJeRZSNpGPAvGALGfReifNuc8GtrNyr4X5YxQdcNLHTa8wPAU04M+2gi/tXMsh7AlKbZ6FOEXmHe68A+twG0gcmPG5hEJo2n5L8pAd1eeW+EiYW/26g/oxKgl7p1x6I+fen3rlhcdNkGpUJeGnf1B/Su9wTKeQjobCcQax6RBbdjewLhbCFvSjRjH/9IbWNDgD1sI1xHEh1hKIgSebB1Wqi9pNc4Z8zRsko3/ENscVC7onTyZDu40QRNApD6c6sOLrAgQgUXdIC7Iinwv9MHFLARRmX/f4N+GfFqz5xvfuZtMeQI/H2MNtC1xVT5p+MhBxo02LM03wW9BuXCVDzquX+X5Zvo8hECl2zed/Bnpze7cuyaMFpQLqLnpgOrIzLUWix0ri50+k6SODYj6Fkzjz92COdx1DJCgrGNV/LyalPs+bsmwQQ2SgfxcE9+pWaayRlXB9zSxoZWv9wMX81xpd0fDLpxfLmINKx8G7hSK8YNU6Ldl9fQWM5Num7/NHkiROA57Bnwa8jEoJSejKLxWLzxoyVm6AwJUVFHpBhm/VOoM3lUW7IVyyCQeZP9zeCfmTtHtMDu4FkxNEUr2YppNmaT3CRtOJsLjcbpDqq+b5ls62U62uJ4HXz1ZBwgxfZcHUzU9t/dEr9dCvAiTSfnDhXnqPP4g5G+TGvcfOw+UdkxAOMvvsoYXKO3A6VqJOwrynUJKxSd7I="},"version":"0.1"}', + statistics: 'I0/F4RIPSdiZYXN7dF5ceIel', + userDetailsVersion: '0.3', + records: { + '2b58e7cdf7c90594d330ca9636565dfd1ef2e28bb49d16dae94335450c496b2b': { + data: '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', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf', + versions: { + 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': { + header: '####', + data: '4VJOhqSOjhTFz/k+JEODmNhY7cCD25PLK7aoD34G4wGzeoVjBxzAJ2NKXG6X3eL8cXG7DjhzI3LV/PiPkYhFf2sVkHbcvAlXBcuQFOZkZcf6PvedC1ZfNh0/QKVWaCmTGrMUP+MEk448fqKfKxJZMi1lUzvMx6VX3bSG5ZQpjt9DtpsPXsbqiz1ujkgwR1a5f1oXgwoWVVcI95yOb3cS9/RPBy9rP95L7reRkzBG8hbyUkZx88yZNC/RgnF68PfgAKlIxAuyMX7V7OuXzHntSxw3FWBGIg2EiWpvAJAUi/mEpZcp+0es29rbHJ0FyuWcW0gbeUsCS0gAyQOj7/VoiWKhG1Zc6qe5cE0F+EA9bLuewGynwX0CV9IDYtoC2IAJXO/HmPF+yeXf1TI84h8l', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b': { + data: '0OkpVF6uWFeKVFpGzUr9u15AmZHzn4RQTu1aqA5yn6btxaKkYLrrBLc4ifw1KjupMRIO0lufr3vQfto3FroPQRUomvFNspupxMkEiVAvZdH4CVeoM54IppBbgji+u17obbDNkLiKaTaNRQ4/hEM/vkKHxOKdWzB5KnbEPkCPW2I2aMgyYvvDzyDpJMux3HyxSlRe+to2moxK6o7UU724TOqwT/FrV8rjLyyvaeWOuMRCBc/hUW318sobgRyZNaKxxnUOgVvrL8ZF/7EJygf0qMgmK6C1IFZU8wh32FO1v5dmlU74P5iDV3YoErswCT0I9k/I4EAP0Vih4TtuJsLRyPA7r/zKCQvg+4TWoEwY9yzpeRiYKpsaD1nDYGC+Wm+mGNAgCAm8ZzGEFWe2EMvlwzv3EkfmaQ8P0qlxsiKuxC/FBZoQ5FarCvdFH4IJaVjquInBZDwuDVFUTmnx4dwAO+18PxIVKyih+jKobhjZiZe4oRdMbmGIlG18TsroOFS8es+4rPAZgkb2AjA3oyS5Hui2BVfDvjT/XgLJDriVmHXszKAA6oApW2ltROAz1ROfEcbjs+v4pY2dM7iLSLs/7Hzri33m02+yjyEuy2hQtE5ihfnm/9UIwGdcaNgwjsa41pSj/m4jvflT3P3pdUTSmdUUfF026hdyNL1TUF7mXioV+cqqU5fqB7CYN3i6ufwQFVhQkitFRDGIhkSHgi9PSo/D06s7Nn8n4KUYC76NH2kmZq1b7c7mElgjAWB6oUrThOAyeo9EMo6BiMwMdjj44nWONTCq/LnpGlrEnsT5raTp3u/N0f+PpiNOl7ucNA8Ae+5l3EYwFz40g396Yhgp75WZM64ooIw//NYcVxkbjjK+bGRPa3VdElMDuPZTwMmzebpdjt4IMKGFGdqnUwiWhTKEMM/FiCUIzR/uv8t6Pu59bUnbtTwAw1kqBN9XbeDlqCIxpaQ+47TyPIE450b59D2vonib1jwjqMOaX+suqGky1oO1kvI5NDqGggu+z2cWZHI4sgKIfzsBbZkwGFgjvlXRY1ei+gbQhFHABwHKw7rb7JXWepMw1AAApWnELbDVLmVGRFAStd79y8NoxLtUawyAIKOg0Blcy1yKQ0Xi/epGF1lRHLNKCe+7y1/zDbzAlz4ZuO4ev/Kef4fXLfTTXbB3Ld1C3ymeX/+6NPaFDiK7A7RZUUz8qCn/q0Tm+4UZmRZdQYd3C/4wi77oGe9yX4ouyUYSXQalxmDbpavdOC8pyknkjopVQFVTe5FcRyFZcm1D8Sur4Bn50asQpocBKl11s5JMwgTZ8XUwpf3CaqfedwRfs2M/QG5vho0zoRemm3xWD7hm6wI5WFIfc2C8VRobyKwxQ72HsxxieSff9rQXUQ5FsXyonHGMPCfNPGVRkJoxI+d9INGyj/HLwa/A9rkE5l1CNGz/ZifHHgVYrmaTw7WF+W/GVVTl6qvqIC/sjVfZs+o9Kd2rQV6Xyd0oAzna+itCxTb6vYAY0yObXbBNM0yk+wviTSEm7mIwKMldc4+qdkpw1Pl1DDUbswOIEmZkPo4BtoNo8dxme+6BipmK39FZ8jyixN8Ty57EW2iSZifHGXo7IMu3C0OYRJmpr2CCZXWL4ddQCVS4ngpC9h8vRsK0PUtzfzIb9DA3dgcULcgvWmx7wWbkb0rbtD7c4aorw4GenCPUUn6sPjC7bsPcYciJOw4ZKS//PFrz5n2wE25vQkHSVx4zk1+SY81flQSSVfTVq7n8TFbLoLN53ZqZCwq/gOL/F9A70aQmtrFLmHYJ3cMKGqm0M3EWsXQ+KkTssBAr5QlhyyBb1oVfvdZ5RdOpV5owux7VmH9WaFA+/WRR9KM94dbwKo0RcyxzOsiHgOASXn/uqR/wgbMPvqRmdaEkPDCFv669IMIC/dbTilsIQAtmTkLOgImtW3uARJfxzpY+mPjyBcFoi2S/Gn+vhqKS/ZOCWMRcGaa+XdViMEfxjbfq501szy+b276qkqAQKaO4LvRMZ3F2MSY632nWBxP2uSCh0q596urHTW6f8w0d005FWpc/srxE06uA1WPXZVWiuGZpP5qUSqp4B+7SYo5ZlcROjDYPkhIkkcFPlewXEJgffkFbVjJGm5V7wVuYt0W/t65JWEA7VJWwtBJLOvOP+y4Zz+dMJpG2W6VWhjeQkESKaOvPVffrSw8kyVC8oSivCP4Rfz5Cl3kdOL4qbtYCdJ2ktg==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a', + versions: { + '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': { + header: '####', + data: 'AA3YiiY3wEYTTnaKKxYsmKqTZDkmG4FoICNWtkJXiEhHzElR5vi1OgMNhm41aRVszrCemeM9kK0we+rMCyFItJ2mLcbsYQRmuuhOqzmp1fCGSoR1x09KpDNug/FndY/UjtAbs9T948zl3TWvdwR9VWOzw8XXxmJg9YTsw5uwhqQXcxdVnQI5akKClcoqz0q2NVp+OdgQnjc+FUE9WeqKY/Bl0MV0l38L07DLcoHZ8OVKPSERnMbcAbN+1C50hp9QfmniBUIoVdAIsNQ4Zuvh+6uo4cRMeWQfKw+DOVAWiIvrpUBSk7pVZWeOoKF/IcUR5Ftem63GIxwZolnhJ+HcTFcNDWkZtb+E3QRZ4A5kxtPZqI1KQwiTkS+mGI/u5zumFtJunrpbe8JgikhV3mA/WD08nZdSxmfg41BmMC8t+0zQ3Jwiirmn/F9a+TIntcwyI/4goY6T4Z/t+vKHVdv7XU+Ma0Oy6swrXB9JLfPF8S8PcM/IlyqnCKkjq1G1eBymMw==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '3c735070f699188a0813489b3fde68e9a7bf25f81d78e98689b81dee364eb013': { + data: 'PPAaxPg4YBKa+02+PpnXDHCEEtAbyyPGrpVdLS4DBky0KrUV1J8C3lsCudQLrVNcRdgtXetkLipukMuZ7lOS+qlr1vsF0JyaU33GpMszeCNtOUlWMidZk0SnjHPPGHBXEzmZm6yVfprH79bv8YsoWASyRamubk8kZ2lYefQvl7QYNBQVb01cyprJUVTtm2MttYnfKSKmlN0n80nSpNFZuTyMov1XAlot3iicojBvSvicsYwkKDmJ5bnpuq4kzqonL2UUQ0TDTJ7erf2MkT1/UPdnE3ZRjfsoIEm07+0ORTqrVZJXjmBjSLlxvBRitAcwVs5IWTUEnMF6/bYhCMdWnF9w2oayHjEnKh2L+fA6RQjkjlfYscmv/HfxErYvFvfSRCiu66AotlL9qwBzEooaXENZfPqZVrYKRm92oZDoz8KOm2EHlttnBgjE5w7kRtdDDBIgGsU94bLObSu0UNHERADv9VitYYK5dEU9Myugf9V8aAJbwkxhzZHvYj6KsKhiQtMnaU0FVO1qib0g2tyH4+TlaUUlY3Zo7wjIn3GMVIomgN04Lt/gBp2vq88R8/erqERKdZu4XXl5nATF8w686gedHHIjpObeVyBN6PTNp9enS/rM+sQti5AOKQLx9DgVaoT46iLcg2/UOgIwt2zDdXOccXqBq7PzS+aSzya5Pgpp2H2VH527/PGfR8D4EA/tiNGhUdwPqz1AJz0td2qCWMllJ8GDgme7Bzs8UG/Gd+fWUkngTwRA/CcNAv/1f/SmS9V6RjidkAiNF1D/CGO9rWMOLMr77W3kAOEdQZzxo5tzymx7FgG0Q1xa0fUY8z57UxViBILddU0gArWyppOjAKtP0vw4eDzPFlH77a0TdXKnfB/41arRi5kWl/fX0VZmcjRQuFRS3t3m8Ta9GINaZHo/QAKK0Wjjads4THGjNBOFq/pVfqE3P8EPJZimE9A79dz5crZCiqdflTgAGUdW4razA2jqxcLbbxvXuSaJM2kecddVvayOWO6gVu/xbwbqgk3eETpO6HBbYZq5TzmAOJEZ+XBt+F+wx4EwYTVxNtzV7NDKvooBH5CDtTxfmDIE3b/FXfqIluPLXuzjUaziotJ+IARbY77w61VjjK1xPYPCF52Ovb3d1A0L1SUwfACzMYtG2Vp7rwAa4kUETedwjrZ1rw==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', + versions: { + '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { + header: '####', + data: 'HI2+42Qv/BK066PQvkV3a+njq1IJeWZS3XmFYL5Q0G8ZChyeMUz9oCSfLW2fZrDcwTQNKk5Q1YIbK2X9PunUX5+s2eKyta7ZejiAs4A6T+AL9GEIPYnX/OjQx5bHFL1lVWCOhg8dGU73A1ryMEUZnflO17KzhktJENZvh+luEHjN0GIqCBypenDE3gs/A8aPoqba2EcJ5nfazVxwIpiPWhyF4HoJ66pjBdj9gUoIqq079MPVcs8xVdO3LfVOc0rT+pCi9+ei47s2q3rwjhC+osWCYgXdkdcf3TJvOwQPDq5JEtv4vofeHsLV3f0DrBRNb1Rl+Q5VNVJETVv5CGOgT9doysj1ktLA61LVBPKIJnmtVaa3IoNMHvTeEze6kgIsgWaH3t48uynqowx6QeveCQBH', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '44d85d696125c6fa75e791b895359a31fdbdaec3303e286d09a484c0ea4a6558': { + data: '5DKtDM4rsjjlFeJ2jznb2yT85d4lhBouKjDGFQ0qkHB1hUaMf+8j7eY0LX4n+IlFYaaol3EfWCbIMrpTDtfCUV5+VWgyA9FunbRHYDyCRZwy28+cJVtWAt7aBUninuQ87LCXDEYqwATDo3+wSW69OOIzqs4dq5bL+SAbX53biquKtb4kDlSgHGHImlpBG+tPYFLVL+fbm7MC3khgVtM7X6fBUhm+g41mAkU+0WUxft9hQJUZl3JH8tSBxhkHxexfekuaoJkFlpxAKR1Mtb16Lo2w+8/3mJ/cDxacjjui0IH2jaZG61JrqJutx2+e+M3xuDpcLeGm9VNEiEDNzeNWhiRP2gojk5liQN7Hhxdl9DpKpRY2s7uMRXeU909vvEWaAcEbF84xf9Y+hgwCGBT0n80VKkHPvGyC9Dnva4HfqIvu4wg0xF2ISEun058kaTy/+BnZu8rRPsc8Y55Q6wbNQvy0npzk82wqsHomrXNNMnoufM3wQjCFt0jIR/UowSBBvtLxIq6fF5PvnqQgwZOliLIM7GAvMvn+Pu/k8Kax73QgIRkbTRW/pOoKIAbvnk216oe1u1+AGqBqWzISgMfux9aWvx2rmk+MZG+S5xdVQzRhhgecpgYzDXCm66FbzKVZCNnCSBtge5VwChrfAGod92RiqgZBpqTe29MwW1vlVils9XBfvDCL9BxMpBYSOOHFilnSwdp8VFPFejFiEg0nJBK63IuUS8wyKtkzsumYJ8WKlLKH/xDtLBPkOnzMzj8s5GowhBfwxatbi5BZII5oEVlSgMlrPUUNf1zExDxIvrDflTMoZQuYTG9SArJ5VIbJrznaBk9LGphrQNH1t/90eQhkCFNdSbLraxxDN9+8qAv4cbbEUUVLXiXO3GN5VZuVZxsvkJ+3RjcsQgg2CldV1B1Cy3iY+sFqtnPChXDItMdZU08BkItB+pStsjaLhja75cw1Qs/I8vdJdo0czWgb6SQPU/UllTxo3CS3t94PgR3nNgXcUYafc5QzjJJ2H59PKiQGdXju7gjLVfe6R3ALysiGJRD4VRQx4fVZKhtnrFBfy+o+4+dMwu1HeW2Kdm+jwXrGWCc0j1qan2d+6G9bj8fLT0hOykuixkFOp8lvublO4JKvrSpSrCcXnE3dxQoFeHIqwI14euka1Waf7D75tXI/leiszCY1WGPyGIV1ezIzgIyRAfLH4RcxWfw+2iaLJANOOhKro4cb/9M6wsNJ91LxpZF+YpsQmUkciDLMafoCvYnmWKq5', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28', + versions: { + '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': { + header: '####', + data: 'UukuFiQRHdw4Yp8YoQ5gsdE9ZMOG9T7TwNbEAKMgqTiCmbQlWr7PWnD4myvH1RVFE8D/L8vUXcvfGoUkENRu/amIAPZv4vj/v41COpuahE6Ge7gOeFDr36bxncCAC9QQZYX/PiDX0OmsdrfsCHk0xIDln4yF/QTzOlygOn/G2dtfOaDB6qLs/Qn+dGuQuCIo6H2ACRT+yW684lHziFwch+4USry8IrI6L4OJDOgjHOdPNuv8SKEPYWeeMiIdvPfpWvLR+hgYVCJS8jiBHWDO7F9VbT+ed6w3b27ORcXfYUXlScedXhfxmxZ9sBkEXYVUhlgVpMOUBw24jVNrpkq5wxt4NGEhlfX6L2jdc2nj33hP7mp4Slr/6gGm7No5woXr+abCWZxgdsbj6Yybbhw=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '52d2d8c69839e61f07b55c3ef496177e86b9ff35d27ddf4736bbe1907b30227a': { + data: 'XR0Do3w0K649LRGUi/FZZqF3s/cTvWRH/ke8qNXqOUh7xFZWd9cWnboAjFu2dRAwtBDIkdgJU5cfPJZIQdbGw8FnyvilokLgZdNqRqov5p7fQy1Fi27pQSvK5QJAiB3dYTmb6SldpuAqdBHcGp9UGecBzzOycqS9GjsXrrrBF0jKRuHJrs4nR8qkrwlQsa5JVFKbj+kgH3gttd2y4cYaOgj+c0/93co0/ao5hzgPovP5IWRf16dxWCV0p80e9ufvP4b7rpdXABR/tkQ6AgoeHF1asE+a1PPG5MS4dkn4o/+HXLBBzLVY+mMc5vsHCfuP7U74DoIVOjqWmoAmKDEBPGSj2bZELTG4guhAX9hdk1cfNRE2g7fhUXkiAdZASc46ny8Y57qc/duR0p51g0b2lStu+OLkzaGhAl2m+k6rxHGyhZE9o/bkGWEUisR9W558M0mKoAzWBoqRzcau/Z2fOGaAD/qMc7czoOMzvX76gyo6NQx9Go7l8BMXPgGedQMAOOVA1uWco1Es/WBzk+Gp9AsDIGPss1HzXZt/XjC3pvcV/Sfv5M7eyu0puNC3XiwFfZWJgoChd/QkIHicJnZlYTyrpO2nEoHPTbm2AY6UDl58K9+x58voKQnrbrdHF04GVBdtZvHiNEzzSd+4SfQaWql3KdhaAa2LzPM6cIVqREXI3UwPVpDu1XHsiC2I45mQ7/eIT0kSQm7wPlZsT5Fu6EFaHh0lHBa5MML5/EQzYqfosFvwLqxuI9coF3JyQszo5x2sdVfSkm3ChJ5iG5T41k7fa6zQbZeUHM9dLLwx+tCxF+XwoxkBJ3fYSYmmF/7xdr15brIB5Pc7dbBZMPiktn1nc11bE4bgyQOpqr8a7m1tAOT4xK6Relo9FkKubLg+hbUr8+6KPzztiamD9eAGQRopf7e7bVNt43UZIfSmCOGopkfZ0s1AVi396ZUexYJm/OgKWNR0BE8P1kXsSj7Q+swYXZM4QacF3u4sQwhKGu/Dxfj8hBecfnCQoe0oDBQwT6Ep', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'mewISOORFbu2QbxavMOFNOKpVRZTFZ5l9SG1T9Es0eDksCgUj9g1cNqRHC4lrRcp1F1DbXLrANM8Q6fK7m3Aw3yOVKog3+l3n0IeEeOacY2iPy7t4XgUqs1LoenPfqgKwvtG4BK0jnyefbPKEsT6oeh2TkfDtK5n+ofVUieCPqgyc/giAapjhxtKE3nkWVuKfcpUsaeHD8kGPY/rW3TlD+53pQFTdRfRgMGV6GveNo4WND54w+7y0WhwAqow/5vIrsZamUYOGogToklldP06raxY581IhwdogLmobs336YJ1NA4cpwLdkb/GlG1Tjj7Id1DY4mxuD9h4pxwrQJ8ogeexBlLGlHxmxCuX/AtiGeG4a1i8QC/CZKuFtQ+URRbCqtKiGmTEvNWVhlbw1MSZsbU=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '5c5fed5764090b8c83435acbc22db01faae889c3154d51d502a3dc532c8709da': { + data: 'uRB9zloy8YqSNEu2S6QgUEznfxgCvfLxQIm7dIxQL8cRRz15WdN1bLjdJkNNr2X0LZn6J59u45pn4MKJo4Lr6p6HB4Sx9f3IjWHjSD5O04PTnddX2rjpQPM0ONFTuOTUf1ETaG3NaOY8AM0nvBBFBQ9hxupGeEVKOY4jkxKqPo4UFD6AEi4e74CMMBnGZbKNPjOLJoMn6c5Lyf2YXMc7stXC6HswINHcMq8zYOuN0qlhj6wllgW7zSQSbeQgz8Xu0RY20K1IxAyzNYq8OdVsNadcOvNFCMFE5BNvoZvKOa5nDGmYqyytXkWVsPHULamBhOUAnrU3tKDAjNWIeUNcI1hCEiVSP7ggsHGZ1PJdHPpSQZH+5/xIPtKtZRZ3J7D91abZHN8XNk0WUC37WhOnIVI+79CIS+t7t9muRH2mBL+v/VIRUWjKdBYS7tTdXPUJOEIregvGc6qX90GC5jt5aYNTj12yJ/AxQdKVP/fmE8klf0ZgRqdp8fNP9IwT8S7/8c7S8TMQPQzfuQ39m3aJiOJrHkQQBbRr+es87P2aMu1is/BTzzbIEGq74sc0GWl7aC2ocjJRogHRQ15NtzGGFuSvP7gbwEp502mJ/2DkKKbY6g0DyTJ+FDe3aTejcW4md/gTYsSTqN1FHO5lg/A2tVrmaAnFFrPvFe7OEIwMbN5Ft22GlGG4GL9L/xXtKTFURdd4uxaAr1xJ6u4m0LnXc1iNs3EQjyVCJxzpW4aubavv1mzGus7fWOB5qMgDH6Oy+BqmrLoQgidy5+6NYvvejrqE2nJgNIEeg2iSrAIly9Md1m0FL93ZlFYIqLdPNn47vvhz8pZAQsLaGyrEvNZzt+67IZ6XUhkbO4NBOt9toJkHW8eMy/go3EBWkE0ZdleXfi75pJjT5gRMPOknSsgpAtB8Y2AcjHvdP9SfrZoOtxtRHJnOyQgwfWcnx+fCxCFPdo7mR2aDRQR5vQFU3+LTwgB7QpCUMZ7EGg4fGexfCKyTfkDzNFRWdBgRV16CV4q7HIIKNYB9dn8mgTldkMjaBIsVFGd8hyvhArWqQdDbDheghNz+uQax3go94gkQ32q5uHC3Wq4uCYkZSMGtGS4xZ1gL+yqjbV3e4Mt0uDbtCucMu9Og/ftPWmw/xWPY2z6L8juU0WsClz1rulvO1zsqJQF7PF2hlvixFrXOzxcDmSRGig4yWszcesgDnu/+bG7X1yVnRjWA6PyfnHW6', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac', + versions: { + '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': { + header: '####', + data: 't8y1iJOn18POJGNiM7JOX59XRrvZDoiDY8SxTnmIRhuqgE6T1FZ56s1ObEMsiyzPoR5OrkQgp1GcT5zDpC1uAtwNRnKUqfe8xmbsoHreq614Nn95vDSpIBCLPqWZYLs5PxAD/M/HIpkdLYBtluFqS8jTPTGGl4Mo7BYJHVEonHN6qgPxzAB5rYZQxGwuGK7m84Hdu05wKnGfwLT49nnR7pzBoSfKgGzYU2PShki6qd36x1T8bFxZCG38lX219pNZ/Ogqu0okqxdNVH9Cib2RWwRdW3a1Z/7PyUoqDCjddEjIi5eS0zqk9JYFFdJQ+VnWlAEkOu/MR2C/Mcf7ESmSlyIfTWkTJAE8T/LY52aPcdJR4CyoIt5LUVchn750UQV26voTKoORkke8uW/aZo/LVoH34CmmNQdH6YVw8IUvqAs16OSUikgk2RFFfI7ca7OGftLJCSwjJT+0bkvLo4jvi6DrLj/OReUbIWEQUmP7cRMURw6tkEP/rpHbkYD8Q7pQR/z4I8nsh14f7/AHU+fHDXZGAczT0ge8FFFinyTVkg/2yBk7jU/zcNwnciSq7Q985bAbmQTP7ZyIErAYvPjk+Sa5VHoGq5kEGYDPTMJ0x1vZ3ev325k0+eEPzX4Pez7LewnNhkDzxx9o1lpHo0wwB8QfkGo0xdVcD5UUFmXVGwRy5Qnr8gb6E4lXKhll6dFx99n4OrMipyNd8it2LzbWVZr/UCoizEhy+3+nI9bg4QBGfULH7uWSM81jyHADRBKWbzAXdxoF+F/lJngLpLrqUliXSIHi5d2GxuJwHd4LeBIjETJ6c4oEEqvSoM+ZNKalTybpVgttN6kZgu5CLI2678nfKYqIro18VqoW507B9Dhzm+34UA/RdMd8PmIlYVgcadi+KknKZiFVlITDidO1vcCh2OVCLQuJshFCyWFZQtthWPupQu6VXOScahFiAA66fA==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '5d2b04a29a8af43562b1e307c416d9590ff55e370d9b542dc1e58c1e30127359': { + data: 'a9CEtLuWMZGaIsOUVOpZ8I5u1X1BUdsCkAMDqZpa/xwgIlvFZop/tTGZ7xXqfLuGw8oBgME3odWfSwysYqFlLyLxvvHHFdc5eWEi4ZUUDRMsfl840zFZjXO+GgrLVpQDph7Uvrnsd4X0BUq5WyKDuLwLujZOS00DZRrrEaim5fHUMJFceA==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + versions: { + '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': { + header: '####', + data: 'CGP/3gax94oP9EMpcFw7ZhWUzIp2DcqDW7CVRblVwQg2UpsWe1K1fvsrzyGC0DTM6yAUXLhSP4T3qyHjb8rrsQCNPr87R1a91xQgWVB+zluCbXH/ZfmQrYd5tY/OEo2e8UosOQL9qieRsDuGbRd/76iIysR/Ce4vGyfYohjKzYepZvq4x+uIwe4uKbzn5YedPqsJ92WTGK5rYIN9fGzPOQMfm8nOkhMLXocEm53Nh5cbBYCw8SGxxDBKRPn3g5z1jLCiOJ5i2KrVQUwIa8LdLPfEBN0FFJEj6Ri8NT9AWzpITZ4xovTomdIdSEvypXYHnkfBw9OWn4KPZIQ8liLtYd6oo3rkkWBZppjaLk5oBkKsxBNSy2gGnh5Eig9HPQYjvwPF7gvG/nunSm0nwkreCMQUzGUd4lLNVdp4dhYErGhsOLb8Rif6BVgxlDccXaIr4Ui5MLrS2vBiO/UmyuYFEduU+7eXuXR0uT6oib5f3cRKFaJNT8IyBiPlvVkEmG3gHZJBXW8yk8fuL2paGC6J5Qp34bkOqDW8BbM0Jf7+CcZURZcW2RpjU1UW9KWX/ga8Z5uNL2282K9C6cZWdw0yeFHsAOitp24xOIJkeyuRnhkpkbGz525htXrzXdwulVSqT4KiZDCVbgMh06k14f67HfYBoJAvLW7thG997HSWQlaxBz40vyjKD83rS1JvJZDLCKTR2VSb5skaAP1ye6CMbsYojZ3Q9/xVdVfW7jQ6nzjT7O2hqhIuIBezJCCvYdZcK2oWY3jW7S497wh/OveqniATyIk5YzIKGteIIhP2lPQ9utTInFzSwQN7LY+pDhCjNT3H8jGZuJFLq08NWTL5AnIS7DEXUITQ10+b9F/DXrM9zt0A2ELKReie/eVeHGGkgrO4ftR3S1RA/X9w4caDjG1vFxGwzFVU+a4TgxnMWwQlaKiCNhm2phgLH9Lxrv8KL6X6Pi/scV3hz+AXvLbiVGMbs1jk0VS5VHV/+Xh58kVcJFhUFl9n+ELDh5byUiOSBfYBaCvUvawkP/OGi+NZeoWckAY9dvvo+Joz8YpA0sQsUDYNNjw9PO++h55HdKOEQYHW0cBR+0PQWgtuARDEcHH8nGHdZd1+0quNJAeUWTKopX+C5cgJ4ST1iPHtnMVYPFQsnZkS7UGS8LVUJbeIYR+b/2rB7H5fzew=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '608adeba618077d125f0b489ef28fc7e3b1ba4fc2baeb01a3a1fc5f568578791': { + data: 'Mb51dELDLMqkQbUrpOZOTFvi90inlkadvljkbKY2flQCxQzyb1OwdZhj+quCah8RjXNKUGR2UMieW0whcLLqDM4KcICsPutmHnXgw9oGuFboPKqtznujC3pvZED8+W2sBXpyq/lGWdSM8TAjoMmY3r+VR0W6tYvtpOBYiwBsz8MJfpC6zJLEwzd0ElqnpGUCIZOBMCAUZ5KO1DpHhm/o49mKmSXks9Ilh6drS1E8IWpTrGknqiV48wQjdL+o1H4/40wq93D8rgvEIQczlHz6klMSyk6yWHLMhAuTd4k2ZYFsbCOtW7ixzFN/QNo9faJZ051C5RP6srlPgXSQA4lRwm5qWBSth5GmGmelBYt93d2aYF86z/fkjE4hNTRH1wJdh233dBJfh+3nCf9bdtdBs2b5DjkRTLZ/6kAgfdngti4+e6DiHX3NMA+FK/hbK9VnVr1YQOZSDH8NExthg8oWDK2WhiXUX//I8a+Oc3pR16kZHPJwJVJmhRSnE8DRH/mYO2VqV0rSnM3I+i/4DYiftAl/inLBVTIx4DE87skkywXSmBIgwKoU5ekZNgPwU83VADTVXO2vlwgNlA31mmB9f++z6zNdC4gdPEiPn7imwKRGKl/ofmqY87/nWQGqw13hts0sUmyQW70CCnNTL4aOXVay8LjrCHEbelz4Nx9Fy6Ba3pMEelpsM2wMQzuOkjN3JlmTTVV2yydZ19xDMDf9c8lNq7PsiRepEf8xXcGJtpeWXLVkw9h59G6e1RVmAxid5tS86uwnEs6c8z4idycMpvTpMCUPG/KEqYYQnD59wZEq2Ctr6cOocdPSUQ/HE4/+qY/9/949z59B+mDPVxcRAED/v65ohop1QIekq1BtDbrolf8rhXLFMv3JWZl27mwUr8+DgSLrrI+xk3v8mbASUKrSjp4RqFRB11kLdVC71JJz1RBKBvfKjsfG5cO5nDIS5hVkBJX1hXP9pvHYjyDEgSI2h9DgtZh9xXEDwMKITqI9jpTuGWNJMas1J3Ip46u0PG2aoLU1O6DLRgfutVDTyJBfNHdlkgBxydqsl5Sxhmjy7SPwk3xmxI1D6CLbCJ5ODf6x4CekWrFmF21IWfF/73oWr8+KAa6R14L9iTwnl0ynmo5MVa5IJBdn+Q==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926', + versions: { + '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': { + header: '####', + data: 'nrV954wGGDHVx7+ovlm+4b2zB7TcjxIfXBsMCBUr0LgE8G+zEd5oj3Zc2MvOz9mLaYH/Bu9d0ecN+E5qFeDyRYbVgCH/EVijYemXpXnQH8bCcx4Ek2OeguqkhFNjLubQKRC38rOcWgKDXL3fa8YEyXQpdfWE8g9X1vCshxVOXN4LR0L5bYX2QP0mmoiFOY1Bqr6cYtCAGZNDtfe43Gi53q3FVOnOUhIYy8qrPet1gcdgVbmLs5DufjMdylXd9Q9rUVZCEwzsORAGLAkk7nWNqL9BtYquz6fK5/z4BwRkEztlkIDrhjEwWGjRujbmDD1/5RgKG9Ztbw3LBMkyhabPlYpO6io5545qndV+x+N0YvhECiZdaBr77KUAWVIH3O8EIeAwyvNGKKmTbHox2h5k8nWC', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '6a17bd6b1bd576b99b678dfdac7da04e79402fc542055197017d3e586f6e8f38': { + data: 'BNaqOx4gozG6ehd386VaVAqr4Gon3oCztTSRSMdZ/HskNFQfRme+BKhMHljLFq732lVDYW13jEcx2Z3h2PQT3Bm5+v2Ke3aSSlvyIfvIiPUl7PbaaImKg19wnAaZqhxheSwVUHmBIbfhCt7UbTP3imEKl35fXcbYIOrWiea/uOy+xwcIbC9YkkRyrrk4ttFExRuZfnk8L6xfglyY9xlZak2OClqLK91l0xUfz/Ol4ylpQxWhmwiJVMkyL+S3Ild0A+CyuxmekcsgzSyx4OS7X7uc9u1SeWjB/mSAzQh+YsZis2J+hFLavUTzWUYWaKUbHcQjFQLHD3ZEoZEoB8iqY6ogeNIkrV22VVHlcBm4QDEhijApnte7OaE1kXLesCABKiS3tWwymSpLy6TMXx/Md4XSY9A+EvLLgUjkgpHq3ftMQRflNvLYlEfYJYXCoAzo36pHymVp+uIN5BR54BdNr2DbfBHKZtGUGQ5+EcnEhPpvoMnLcf59IK7C99kNJ0fLzEfBO6lvGKfG4WfO8AaVDo8sonaJCCMEdMUDKmNXlBsbZegXWotZLdIbZqN1m9OtEt6ey5PAVqR9nvHL0wHX006P2b1092Rv5fTfaltztpXDsJZNttqWP8U2vkZqYPvSBu3jdCdY4Gkjnea47TzTnPX10EdFcE2r0h1G4ap8mSgiC46j6Wuzj5IhylgL4fbmsPfNvtRQB8jlW5Btf+i13Ed79W8YnzyYbgcF02GR5AFlXBMfvZ1Ve9QETFnSDJNRLcPNNpslNVyQITBlPjfDn3NSgIVdUs0EMDsDIQrMvKHpsWuiXnt0sKrRBJ+MthJh2bD6jSSYB/f71OOWT1t+i/wDZ3gJisRR+KxZiCTt+y4zygjOiUH65BcljjTnEv+XzVci5N/C9SFyT9O0Lxb3/dNSVJLKcpQGCOz4pgM06NFQFePJ2dr8az9pjCWRwuGzhpRsBsqyOufX3QFveABvRDeaEyNWOWuCpnUMaNXy9YdfODWFQa0Snff7tDD/fG0ipAY4s0/fy7IZWd+pvgayBouKlt57JcVU6K3TMvE=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a', + versions: { + '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': { + header: '####', + data: 'ihfKoU9bJ1HxBWuZ+wyKaK9n8PPx1MJMB6dppZniB5tnfUvnUf9PPA78x3moJRcJ7fVXl/rNHWv9Sqnf3wggFD1iuDFCbxXAY49qrWEdXWFyGM4cihTlWQBYZu+cMWQrdi7dZPUY/lLltKTSRKplyVUmqfG04yd1qCzmiSJtzKUaIySXkQGX6oxoeOMpw3eVaKJjrIgikmjfxE8f43HNpCPG0TYq4CNmvZENZ1z2itRtgIUSdwEaH/xK49ztqxJPrbeXxTBUKIZ/toE79okotm0AysfZdlG35PT9eC/hzttdfBPwqb7auj6J3ttc7DWkFrKWEemw0dHZYL0ut+pdodcvWLLrP1Gyo9aJwfE5heImchRbGal2BTUiyZO9zALdsqjRvMYSyHfxtBUDAggWL6OA', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '6b147cfb119d690204cebb33ac047861a74504c87501432d914e07008ff3cc3a': { + data: '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', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec', + versions: { + 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': { + header: '####', + data: 'dn15LeaR9HinK07oo1yVaKS5SgM9SN4jjB5psuvJWV77JPSXYngldFuC16IsKzrkMuRg7MUhdjRuxYxRnTla3FIzWyuwfF5XYHM/AlHMbp/K30yDk12+UtSAEe1r8bUg5ra2KOhZ2pGTxQi57qWKkVkKvnmxeQa/LuggfC8PmlYQpC/8acTPxoy5hiVmHsxO7yoTl5PHrIee88kgLiavSsKRMMHt/zIWoI7liVcPV3xqVBrlAoOgtATNdqfk3YF4N7Wokyx5sDDOlxCXYSoQkHfTNVxL6la+tHcE6pC6OezbwSagB67ysJ7P8ek2kTNfzG+/smdxq+iolTlAbJ//MtdBEDOAlfsc6nXXo8N3OjGNaOActaMP/EiQUD2NT5L/JOQw3zM5lJidNcP3urT3PxQ=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '97291f9d95cd97d089f940e5a4a674b7c33b06637337d3722010b528ab1fe34a': { + data: 'JY35iFwT0aSVy9r/b2tHFmaOC/AaNieghwPqz+PzMgu82k1WdeKZzpIZWBf7ku0VXUf1pOYRwUVM7AblkFxlnNT2LZeLZojwIAneSZIBRExaLaRpZqQEdqNYUr6tVayAdgB52ObXBArwrNRMSFkZHicGjjvoOI9WS9G+dhlPaY81yW5yQhmJmu64JebF/c2HljkBj+3hXI4utRggddaDKpOerSw3PHpbJ0dPSeH+EIWG+3cWCO5Z4BVkmm/wQZG8wu7ymWdxE1Njm83XiTSLGxc2YB4Tl72WRe7ekmobFGM1BRzf6VzmBKOFzJb5SBXCi5XdGumv1GgtJEIr2N4zRJMoVDTu9qSzF41mFKbuGaldMuVI1pTsDTWAOFYq9ntuFoNWEGucWOeFZZQQTvwzdAq0LLp8/A3qEc5Xkf6Kge9kkG34kCkVcxAKhuGWjxUVWdmLSAHKNR8hgipKGhLRoUVxJ5kLFvm/7BNXFqsKdZckFzHXfQcemFoPKDcqhuGVrRhPQ2VG4oUJTJ1ZjtQsUwJPHr8LNBvD93gHJetF4DtKwercWBmlPTAx60esw8oilgJJoU/u3SnoRa/zQdJskPjRvn55C6Kbp93GGszhiUNTL+SbyxeZOyfISLj5xyVEXCJwWOynzITQfrU4ReoWUAlhk+LwnAbnJ9rEqVPkjbA9cB+gXj2iM5EDLT9yaiMlNmiPtrq/sh0w/VV70Czgzw+JMZ7efvcTP6Q7jKEEDDF+oaj/x456gjeb1ckkK5dkTVk7AXMFAwfjfIrrPMpC1CEa5h5bwJhpqVe16IU8f7Nb1pnGvd0l8VGUAAavrHXJEePqTkR+vY6I0hriFuXTaMbnCoJW70lW/FQao7SzxOdybymL1pWPs5bVoUaX+zrvBKQr763+dm9gSBhGtpngZ2lQxmO5AjfRuv2rG/SPZsFYhTE4JKJIKEdYT96FOKqgQUQrs1MLppYH4BTqgKwjMUGoTWGJkfF7LfEgbOwly/ZGLIgCD+fk0u9a9DfRB4dIy7wstU6MN48nd5zz6GqLFCrf8wtrN1yEpI1QqjVvNv5bzuugJlnT8WfU6m2ppKBmNlgZVhYc0Va/90ybcvQDLPVVBTnjYydlgE5z86VfMREn3/5+DgsXVXS3QwXuWxjYktYsg2ts0QvzCIMCk62pAx9LVM5tn93lm+RNg1y4EUiDTbF+NqYDCLu5Ea/0GXmaHLYqu9X6z5/jPUq+EgMn52L4WsRyZabiPgxCvXjpntPJdP5XeQ5i4ACOFhUwFFRAxWPWVWv6ecL29f5WoyfXBsPM5HOSa5eXVz89Uk0v58msbf1sxkOjjzSXQOB/hUrkSt5ZlMpVfWye+6uBelHCWWfivMi+S4tveDJgDbssnagE8EDDZxIYuYhYUGfbUjhnvKuChAWw0K91ZtRDESFMpRlgBAFCwxgI2KoDz5yFWNckPA2ki1+VR6Rxd2z2+ihu4uI1qtZdzSC58PHlBFjeZKFzZPABfttlZ6t+qijg88Vo8fLLxakwhb2kJ9Fs3I3zqqnLYfkvfCw0/ZbwC5fH/5Ey9WiIaPJBjW6e6to4NJcy7pEAJVKRsCpfP80D3+LBzoCFGrdMmhwymWvi7xlG8oZPYkJrvhvW46D2apRdqAKJrfLn+oX1fCtkfagH1bJ2o0a9J+ckG4yTtoxBfkxSJ0cCErkQE1xU6ADCd8+p+2Mm1Ls3p31+Ynr8CSGR7+ITZMjMysnIc9J97DrI93Trab1mOp/T9zOM09woCbopg7IYNQxRlcmpH/vZozmGWHBWGHAvl/+ey9FDwG1t9BXf8kYGlwg=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74', + versions: { + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'a4+XW+nJaw10sl9INOIl+MBO6mRdwmGZUW/BRTvcj/PlpVA0vCE7pT4JgdX3IwrF1JTk2KaGHKqzKGf8ydUiDL0p60R70BiVmQlony3kmi5XNCZ6+Efh+EGtM+4LNQ+2jojnUuF4xKRk729VMV1z7b17SiuQzcHwkecBgYxZ2Swm1SJaia4c0tk46pzsAKVrWVOuadtemhcJvHnYaQ0I2bnUEtct1wYldSI0DPkIuaI/0+xDn9jx1nk/HEu3p6cgMnS2vSN1/9jXYf1cDsrI1+yuO8lFClx34kU2mXCjDgFZGhljkgU1HJfeMufqyJ4bYPQfTL8/5NwFNNhw3HVFsrcWKcbct6bM0Puc5bFA0cSMCVx+61ONXqtkKHy9NPdvl4po3+TOmtXjooSOgQU2hg==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '98af9721614f0d2f03d89ea5eb8930b7f1bee6a55a8e81f0eabe964016a930e3': { + data: '0ZJHKdh904kbB848o2+gi5KMfQ5p5c1FeE4PZrZHhIyDl13DnxFFu1vm1t1OI3g89YGQejU0vzT3+d80MoO46ItdAX63V7exVFkZDnkozjL3Pjo0iksDuz1nAHxHGMSoixIKK4WcnvqMWaMdMk8LTCl6EZES3aHaqjZ2ywROgNBj2exGBw==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', + versions: { + '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { + header: '####', + data: 'iumHWw8KQNnhFThhMLBzHEJFZ7y53CqAwEn4DVn1PYVKpaMxjtBHa46XDDA3qliCbqLzPzDKllL/7HHJZcxxjyFMY/vV9p6YsZ7F9tVaF1cCQrCWdM52LDnKrmNEH4iT7VzJ96qsro1osgGwKwIucSSi1FkhWOFtOQhESWIS9TVrFo/yQj54z3x6k4juXyeLN5yDrgieypbvN3nsTOCyjIfjpaAw6ztcEOo/8R6/+mKEAej/eVs=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + '9ea260fcadc1ae2bbb8545c32035dc55499f715d005fbec71179600b50aa907a': { + data: 'WQE2bjUwhJOc4e1OTFI4xKTDRNIaJ/QS+OGszIo2GxP48UVsjMts3M5TtglFfgUmXPt2B0S4Fw5zALIs1r4o1xfqTuhvlZ62VpzgkMsE9Vl0fQsZawK6a8oKErwAoacZqkdALXGjaOYSP410tAcFIhUvsBmRWZIs02EOV0DMqCe1fYSkNg==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', + versions: { + 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { + header: '####', + data: 'VsZfs03f+Lm4zyHzyLstuhqWX2f3fDjw56HA1EvhFAPrTK6uM7pvXvseuNGT7oL40wJQWjLuJgDZ56NrXNDfoz4BUNpcrSaJ2bUQS0ZDjmoOODrLM1hFmd/gzsdpx70M/b68BEqVbHCf0Z53TOsLXaFZmAebMvbrLMXkAIYP4wrhbLa7qNaEnj7qUaV/+q9CysfaOKpRomaj3i3F3/kohJL4NdNsZ/N7qzY9/pQHFaZT/GEPvZbiRr5tGb0oJLMG3zsHKrmsZHh3kpHScyfxqWFzm85ZRAEx6eOjXlfAZey8QgZyLVmRsVsDyIRhIePHCuMukRokohDjKwlQi2k6eVXHSaEEAo6jbK2a6LgbbQ1uPNf7ay9WtxaCcGCh9qBZJ7Ndq5g746AN5VzqyUc0swstRFOn9FjB99sAenhpqzo1z0Ddfb3reiUmNuXoETlHlA8SYfb5TCVoHfw7lgV8ikv4nXW7eEAxYeB03VWBuZPFKzlI4k3tWLHGytNThQ3ZGhcH5/Fi4dKRJgtzgWAJdwX1qgP6+Gcu3DDcrzcrIXFWVtsZtFgwvS5acy6hBha1gN/EapZoidoiIIkh', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + 'a92c1ab3df0677f63da3cd1fdcec440fe3763e072e1035f8455672a97344a6bd': { + data: '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', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 12:59:02 CEST 2009', + currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', + versions: { + '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { + header: '####', + data: 'EkK8xSZRZAvE63intN3FTaRKNhNqZbu/5L94kE50wy/OdmBmYk+TVYe5WmrHxrJC+9c8g9Da7vQdH7vbBWwlLpbuPtMUDUxZgBQHdADAxN3OKrTbf0ZXLVgWtm1D/OBgVQCCKiLKPjujFSs5Kp2Azjnm5W9gLnYmktVhRYY8Y7hklX6AMyF/cTw1k2HdmNZ87+YGKZCUcDhDr77a6m5hhknxUXOEXaeKlL/Yn4QudgCJdhtbkxifB2GPl9qal9DOsiFJwg169weucHUy7q64vMFEc9RZbbJTpH7g9qGXELb7VtjaKv7A2N72FOt8WdJux3nsgBrAkZd3oIPAGr2KWSg2bxbJ5MU9Wb/LyTXIJQb5z/0UtF4dlavW2MFKBGg9vIU2fMukOq1YWKwZ1TjG6GmO', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 12:59:02 CEST 2009' + } + } + }, + 'aa5a54aeeb4f7926e4d0b469207812e5384a4e00acfe9248dee45e939dc58b42': { + data: 'cGK0775KN6QUhzU2QD7wFYwTffs1nZ0wd2otvljnUs8q7pzmnA9XFQNkvuqjh0WseVZdqGLfUYrrh2UUhMSpKec0tKEmrNqijP/7LYiSBte0Tlg9OXzIqvdhFEtDO/WC3do4rYnfpc0pJolE+I9J249MrCbSXyQV8hDeD7IRFJ53', + version: '0.3', + creationDate: 'Thu Jun 04 11:27:25 CEST 2009', + updateDate: 'Thu Jun 04 11:27:25 CEST 2009', + accessDate: 'Thu Jun 04 12:55:14 CEST 2009', + currentVersion: '64182e6e8c2c3410ee0e30050d0423af5c88c5c53600aac101fafba9debec99f', + versions: { + '64182e6e8c2c3410ee0e30050d0423af5c88c5c53600aac101fafba9debec99f': { + header: '####', + data: 'UzVgxfbPpCV4VW8nfK5AtzyKlFUQs1MXW928M0cWqPzQeA9t0+oRS60ZTvDdMjqWzM1Qs0mOhi7wdLdOoZbbT0wUgeU28IMpICZy0Jy+ezjjQxRnC8O5yPQJgg+fNrUbtn5BWMonPVWC2hb1wyEsIJyTBt7i3JsxVsPzQ18M1lyRZBwa2z0QWRZiUF6aacNf2GFXhCkycacNztQVnMlq2f7AXPAF25l9ZQIO5VViBZnbXwIyFbrmP2xJX0Xpp7Sspt3sPwWzg1BpTyjl/P8tDHA0+fe/iPhLGNk2omBko+rPlUwBymvh/t9G4PBNhuHTpEfHW1bGQ5RHGLGLJsBfpNuWALeAfioRakynNpGaCaUhxKOysTyH7BcGyDbh+QxyBkX7ITNRQg0lfNkA1PMRGnREph2g+Tclizgr0eawTstTl1qma4qYKEb2egtyABuvhi/q7ltK55VQOLO51VOY4cJQiwSXnk56FXFEaLS7Kra6zc85xJY1ZP+T9CZmmd1E/W2TMQ==', + version: '0.3', + creationDate: 'Thu Jun 04 11:27:25 CEST 2009', + updateDate: 'Thu Jun 04 11:27:25 CEST 2009', + accessDate: 'Thu Jun 04 12:55:14 CEST 2009' + } + } + }, + 'c0e76e60e08faa3ffa9d859ed869ba3cf3b42becc9478d45ac94cae6c004cc24': { + data: 'yEGo5WUC1jnPQRqAmksQH5Ph0ChNdS58uolzBds2+KFBNZinqbzr8OQgBax4/zN+lqLJkvHbsV9/dhPzCfGHV0Q3q6VwZt6R7n8b4V0F+IYvq1sbv3THahwk7icZcrJi9TjaAKp2w9IBJ/uf+rWoZKegmZXnF8cjq10btOk5JVkVVSaKb2c/v3CLYYz74PEb4ImMVSzNxWTy44w+YOIWpL4IMaq2nWpULIkulV0UAZLOudf38cEu9Zb6T9yGZPrACSjlANW1UhtfH5KosUMhMRlbyAWDD/CTF58Smkf/u7kzyCH8E/W7BE1C89GhWjaMwQq2VAubJ9VAE2CAJG1ax23/ZXoUgk4oK7ReY+J0QbyuHnJDIN2FhRLZt08MD0TujA4xyg/Hp9S6F8cd2hV+BFVIAb2/jXCH2OqvQ4pq93DWF375P63uC7/uz3j7+jYXOmggtfd0IX+d7uSG9V7FX064dl7xJzggSwnkBXAsuSwiQjFDB+jPpTY2k/F5+UgIVEzdR4CPMmaEc+Ied16XVTr6nXzqK1zLRwmCbeCL1ZrahmZqhqJQsV0Z66wQS6pBr6dA9YSkTCzH3lgBg/YSmNeKaaPmwD1oSoqVwkzHigdUO8lwzyvuMqZZdk42KVO/QPC8ex92dvzwvSoeW7EVNzP5fSymd6pmO3d7sdWCnzEQCWP5ADfZBrH3YH1oLY9UzaBGiLLemM3TBZfBZ3u7k68y5QnCfuHtL4Y+IEcgtOUtAe/XErIaSZjjwfw8mfrPjQ95XA3841UYNCtoLMPTGR3rRSj/Jluh6MHJc7CpTOgcgbi5VKqOIrHL88Qs1tNK3wBA8u6RhIG6B0I4lfPTE7Jq+FYDyoeNf2qGqd10XnwHi0GSoCisi4NFawaric7GmVMuQOJsJK2HVFJ5W6e+IhShN4uWQmlFpyifOd+91tMrJ7uovviHkJwcg5ROVTk5yiihGByRUmFVU0W1Azb/CWiQp3QiFKSyHq+uQKUR9gPN1WpaYupSnp4+1tJclgdeMwsQeE40qFxQbBDZynqWeSFovPHXxhiu7xjkLGHlF0QJGMXaMca0RIr9XiQKSlQ6FrzpKnFzmOPh0LnUDhd8FGuMPgHhZ8L79Utablh9GtrJd1kWzSiUKpIQoZm78Sbls9wyc1LHK6eUAYwB6A==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', + versions: { + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'k7I09dmz+LypgSeYrYH3JQGD5Mikr1YV58akOGEn2Kmi3t3n2ngvDB1+cv9hjREPUiGIi50ZQJQw5pt6eY6jOD4aCgGjBqHYNS5gfbaW9dHhjXRPu2e3yhMm+YIlAaF005zecnB67RD7POLfhRx6qjLtqktUt4mAotz3ts/nUmHW45psLPLVBlpmeTNAaSz3nXubkoyfpGrotGGEQCndB57L5Z2popMAdEhT2mVQqzzpasOQnp4PJVf+1vfrQ/9AP6ublijutHn1Oj/HsBmrwE2YQpj2wpZlGAFdghKBgtrvLMk7dsIdDuK0MIQoDmgNPwgiF5NNmG3hoNhS/WNls7uozBNMYFa+W8IzP3e442zJINdGs9zDpEVWZfC35OX4F6QKGSeoHDBkpB7aWAXfnkKz9owt+8OEVEQ=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + 'c742849667f8001483c1e6d3d388ae9d02a2e3561a1be7b1866b62a356b72b91': { + data: 'sk0Rq438xMuzxfEwjPhlg1WxN7Hyrs6VW0wFLQBB3m/tNK9DsHpswq2eMRqKv1S1q/MFTyx7/Q8YVxRMkqKWIgUQRe0g/arWR3iHP09t5JMFIEqxIbCSotukZBgy5aXlG1WMnEsT+tIqrmJZzpOUy768JpkJjJxdr2dlGeCUJbO4bitAySOvpUoRlCb2/a6D5Cib4NU3fjzrW+TZyQB7WpspAfxxyg2zTU43D74OAJR/wy7K3Tp7hOl9cXmUoHvM3vp52ENvPdZmy6wAbz5d5Iu8KL1mxwGbl0pxx7dDecbMJOO/OjHwH2/me+DhyVTmv5smb37X90fwZRt61mn3A66ECsp3nq6pRZaaS+U9WRC1UAVifc6T4DWqrrma8D1BGnLeR9lQxJj7Jm4foKvnWqSeurdRNOyZ38XK5SBSZd/FEalS0UwawX/5qJhwdK2pQRvrTyDDrXRSNj3ssuB+3YX6l0lxacUO29wFjmkh2WljCkDBYPNKOVRLBLUtgQ1pWKciy8BlH4GsqdjvkcQorRgfgS5L0Ce2bHWbBsy5X2LReW6Ugst2wt7Q4xS75P1qF7202s89jQVQritexaUwbCibrZ0GFZFfwnDT+JjKiNiB0WvDBO9tdbqzCA7T62+wUOtCX40tQc6+4mBQkkU+mi6PfsInGiafKctrp1d7GMQHJWQHIJhx2LUvyqPxOa0hE2vqCSJUZmNVD1KzMYGguPtHbuHHaWXc1cNTjQuuTyXDuewBl4NnTgTki43J/lVt0VLuoLIEQx58y1rMTVDTiEufA62mmLxokLYyt6VLb+OeprhuYiU0PhkgkDjRstSnRE4B5JsvFcPdYENYJwRYbC8Ho/rnAvfBdGlYw0TGS0MFcd54JoXiE+oVVRDuYTVfm9ytGYkG45Z5uX0D3Qm+KZhGAd2gQ+NX6umxy0v7RHwqtUjSqI4U0SOiVRNdwFesQRFAzZDtr1tKNf56ACLt/yXl1GywrHljtr4BlQ0Nym3upNweQZyO19O3kaQmtbTbp1Tg+xewXr2MZ2U2QQRNrCzVeqe29eHU9133xo+97NxGi/HDZ5tr5aUTB+OXqnoIzSeqyHLIv4t6r8D29+MTfZsf4sNC7vNlpO8+GLYr/0S5md9Z/zlx/2iPeAPnNkf95gkav+6U8F3nL1Ok8MUG6drGrduKyv30CGDEwWJqcDFJqOZjs8reCst6S1ijRhwm93fqkg+nzqw8mZYeltSbTXFmpypD20Ravw2JdJUyo3umyZiyPaL9UsCFSf/ssO47C1HTN+OkRtMcTAyKEqhzvUei/JHaOvRhmMCam65+gKuoCwy/x7Si/oRrQ8lZkF8=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', + versions: { + 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { + header: '####', + data: 'bGK0B/s932NBepXEWJJC9i15cPn1iy44m2xFxohFQ1r2Wz4dKsy1JowXHssezfU29ge34tx7PqbJM+o6ExNVkgufb0tynMeQAyPcoV7jSnxCqBUfupTWndRq6YHkG9xdsLLrrbmmRwV7fIr8Xu6PGUbCs23sDFW25tiLDtps9VqFNb8jBQ4ms56rjtDVsL/VqBBI0koojN/e9JZr0/3Wv90a1qn3Uz0hRJnryCPuoDBmcLFdlNcd0W8I/8SGJa/94V2S4QOJD0KqP1+/jYA6p054V/tRnDlFdkV5G8vm0XqI1t5cehSV/2Prq3fGj2UaAs25C2WU0xAHPKJErzy214WztzCd9vqINx+DtPEewS0QcVvnqnC4kBMhGWKUqkJBySSQ0nHvkJrBOjeratc=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + 'cdc4624c921b8d99918c3cab5264b5e6de39df30ed167f504bc0a2c612404d5d': { + data: 'MVUf8enllOr1nuCWegNFBnC0YrydNpddm5VZzlT/xJY1YvqIcYnr9HKk4i55TIdA5zjcf5TqUdwBUJ+LbsaGA3CH9YBz6AqAxt0mQeTaS8ufyXDzxHthmTKcsKjPEuJ+1R288jz2D7Lc24+YDNrAySXWg2i3+mJNIFU/Sg7+rLiGpcvB1go4zlh0rsZbM7AnIcCRM5GQLVxtVn15xC4fDZ3rQDu2A3GNB0+RFB4xZlGFIidr5ZmUc+3/0eSdMWb57xRdCaxESjWQbGkDF6OpsozPVuXEqd7K/6RnHAjVsTWvLGtCGttznrCcaXquy1xwUr2LGnqLSu/+Jp7hnZhkGGrFxMFui8WyiVhpTxr1YkB8X/S8lTvsgsUg96PGgVlWK0XeW0GvWgo+v+6RyX4mChoTO5lzIUQuTivve8OH9RHY8YwUJeiY+Pg5ih4TpsGULQRZBIXrmWGdBA8euFSu/mPYuBZ6j0+wD5monR7pvrIf3kEQx2g0N8tdKmN0W8iYV80ONMWqwP2rnbBYHbHE8cljP624xO4fXWoMYlufyCmQp5Y7f7ugw7kWO1gYsMgY0e1pZ28U2RQsTFNLXuLgbeOPz8bpsm0lTFec+WwZ/yMTXFfaz+hFKc60sUADKO6ax24pnUId9+ih4J1DBT9IfUadXcqKN76nVWl7/iApOu/F9kMLK8AtxpSpTDVEZTcS2RhdyvVisx2vqDR34JSP4Ju7qaLIxOlMrc9DVTrz/yMzqwjjefS+w9IJvuwz2ikCW/m6PesRwTao4K0TONJE0aX0xQ19NfYJbNU9Xfs4IFyr8c755UeUA8dK15P7hgf3E6A+pBTj79a3B2SfKh16jOukNsdAVbZkJcc8m0ABR1azzNY/zr8MnHjpZuhhFFnqtxoQYi2si4Gln6Qh0uLwTN4557Igh2W0WcZKSAo2wqfgTx7iRkXz2J1BAbdaN1wmgLZKfljq14H+YGOiqhHndM3UV5VCez1tpA5eHDZyEtMIyalMbTvGRoQ2b0dC4idO4Ec9CoeYwjRZLS6wGG63N8RBdOK1RQeW6hbOrgJIQiGyZ7e34OAi7kSwC65f0Q7SOdg1JJVLgUPh9vfCkFyGEF5OFUNDR+C7Whosvvuijl4hKurZj1KzxoZIAl1IY7C+GiAL0FmaTqEiQVjjz0xf4UHqKw0qEwCqXosbhuwzhmV0EtfNRbWEj5yOt9MyXnIdEAgmer+uEP6OYJTtPx1M16KFl4r9BZ+2h7NdAkrBbkuhiq0VZvBifkinOwe/P6zo6mI0NVmLAWrAO8ZaldY2Ih/Px75C6g2u/zA+2U8k6283cQFt+E0b2qNdUcqR6sxz7gu5Ym6Ssf3+8x7KHrlsXoClcuuv2MO6De7GhRbf7+fC4IlMuw4YwRS0MIFg+nVMV4xyCAVn8z5jl0yngSt2wjdrLooDa2IRKIpxhSreVdsttCtiN0pq4ws+QTsg7PTUf3zAgVoIfuC7CuTr0fCEtYpZxhey7cuvhwtbdcANAc23OoedjS3o2z0vy9/dnEA93vbVmJ7cTztPOZA6kKKfhaWBMZDzoNbkLU7ebzqv5bpgY1/aKYLVJxUST34ZiWigna8nfBS8nnR6N0nKpslE4uPv1oQgSGTtl3A7e+xX8htlIzDxLIblQjZcZgdtZVRSmUW5/NLraF6Fceo+FZcgxiO7+0h5ychXL+HkT81DCbRMchmTOA==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009', + currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130', + versions: { + '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': { + header: '####', + data: 'wRPWbH+Dw3y0DuWz0YDL/e5zTQukx6++cLlCY/0Fp1J2qZS6i6/CLhQrZdOLtXfEhgzkxQygcYGMCyz8wDILafKNIAoS2BcuNi9RbbA9tKXDeqINcnYdzA2NDWj1tQDoNU+/KssWdkI0VFSr+A/EpLMfa+Kqw4SMqNVbeEAUT2Nkyas+eyRVu2iLNV0bFzxzbXvHu0XK7rqL1Tj1OxY25vvA/tVRI4jlzI/rcQZrfVB/BTqzEymFel4hDLu9d4UmZn6H8gubyAU5IiK1Jf6B8nZnNhs0JKUPEYwSXPk9tAupRjQxsac2XPyUQXkemT7TgZdFuzLYQxOAtUmYHhXyigzJRDRY4KPDJwcHq5bCw4OwBNzjhCm0uCQLmRpDIauPVf6EGNs0vorkdOW758bmUjMM4fwlULIocKfhreJrGiGbXTNW80h6SljKzXdlFZAYTSdsjmACL37xkgMJI93faHuGMQ3HuVqXuuebIV8Yg7dSZdWsEus/cQPnOXvVok9qwJ1L+wJs0darskaEN9CGOEAjky9iVoRLuKepjPWrSorvEitedjErBntX0ErI9JDTCdke2jO/2e97fGlrU9++k7T8RRScpxBKmXVHnYpqiesX4KtORnGQFrV0tHgoSiD+Q9YwBj3KSRdFh2eZ0t72ejqehhuR69AZqC9KvY2b7O4PDG//emeXLXMXuVcBawZGgwpOCeu0YunjdgcASADRPVTh0x6IGP6GQ50LoiG5hhiA4z8PRqJ+twcvZ8yJr7AOOTjyMyi00nXPG0OAG5Xg1sTzXtqTwj/xVWbzUEMFt0nxMSp+EVD/Zo7+bdDY20FKz82y2DabKFGAcmjuLTmmS1RaLExvtsZcB5QihhTEwEUSI6a094udE2n1dCz5ZA408BCMi78aHFna+pg8xLEJHLcLZ2XJigkF8r98XeA4fFjWUhfYEhIjclG2pIaSBaXqRT5QA/ziMe4OBTLKTHIp7K0=', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:22:56 CEST 2009' + } + } + }, + 'de7ce7e545acd2739d5d2d00b04f889fec7acc2229082a7a678ca050e2fdd3a0': { + data: 'l5j1yk5VXiXb+81T15uzjSwhxBdsAQ/JG73GNCGulKTA64NmN5SMxDL5gNV5AApu+p9AKKOThZNER9wQgDt05svLWN248YROu7PTsBJpHZYLt2JKlRDO/SOWHAhWkmHrufDs6omk8TpxVbIibsE9Whp4CjkAneGFpvzIJcdZDyWfsaFXKs/gC6O6mxYgU6dBtvMemorXCgSEwL/B3NF6OkudADJUZTIha7mjxa2eWQo901kwD2EKSvVyokcMdok7FyR4cXfs9K0TSOOYK4eQWrqE6wnt3Ab8OSO9oAdCFIUB/WUES3dF7zshLNFG4uh3G5NbTHYBoOrUY4rYOzx6gXWKgv+AiqsUYQGIphPm7GSs85s0eb9IiLNb0rQnrkX/Qeqorg3EIe0aRnWmAWtRWb61vClo1lLIJFWXbK/6DSecAfWrQmD0ExbJZbNQ6WjtVg7fSOul/VGOrbiG0QysCJI/D6Pt5nQcKf7Ooze67CsrYOnmF5oU6BPZHuyNPsaAFZR5TOZMlB1JASkk/dS5W9vgX02+xEYzT14ZLqTlMsgX5ibw69xxdrTcqsbHcfbGVn98FZMNHPhP+XP+ED8XllDomt1oUZEXU2cZg/s5QLFTYKbQIu2j8xgaDMmpAyzIKQtenpf4G0VMVa1T9lVApqmw+ILC31kOWwlEknQhey1ZMowCbfLMw9ipozGyNvG8QOoDQCyJ0nQJ7OBI0m4BDXJXIj3kz6LDrH2KJYu63JFaxGNFhbNDoMNhTdLyD7cBUps1++CgKNxcSezY2sWR6YS7OBW2wvy/X5yKIOtWg57I4vvcFQCs04EanIuViPik2CRbTSAUIiRvi8sbnqXYNT1PpBIPiQJvIbi8NSjrpTjPlEL5MJnIdjX6mjXbiwp4qWh129MvMZzF+Bann4BlJQwwGhba/X9d0K7pyOIQ605W1PeOjgzSPXE02wcemgF/tvFXSDtO4LOfiSCC04OkMtGTwcG5yMOzU3rhu64LdDknruYjTZ3W3AJitWixDj/ZEeseUCQbaJjMX8wsBFrPqbTWaC9MsztY0qM0w4o3lD35k0D3whK7zdfb0i1rgw4TRG+UaAy4iv/jxB9orqjS4CULzPDXZygYopwxRJowF4Sm2u8uk9/NEsuJcDmfHOh25UTnMO1HGSNRZt8lnA==', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:31:01 CEST 2009', + currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', + versions: { + '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { + header: '####', + data: 'zC2F75+cfQZXWJ5EquBKnCHqS1TekPWp4Z1KXd4166/CY7tcxfEzPtI/6QqkSdfPYesPgea8G5vOhTzd8yL6nIL0ksE7dTGLXx38wZTXrOftuiHKuxW2HLGE02WRtwWgvgc0v4nkG4mm7LIwX5XFSygGmG3fKfPwfLaRhayD4Jsf15r/zWmU6meVCvR3VAYvHgNqIeEOhzhVN/ZMZSZ3fb64CyDa8wc9KZpmbjg6s+x+80sriotYwYTq3CwiHqQyZOZDm3P7rhhbqy3EhyH5aTfroSBWgra3HuCzXAGFFog3S1zl+a1Mr2ZlmC/RxCiMVcHVQ9CluNU4fITebcxE3VdbcgcOzdY3O7U7cWFaCahk5y/momzFVstPsPQBhXfX6p3ofUTuHh1jj2OIRcvrWgYb', + version: '0.3', + creationDate: 'Thu Jun 04 11:22:56 CEST 2009', + updateDate: 'Thu Jun 04 11:22:56 CEST 2009', + accessDate: 'Thu Jun 04 11:31:01 CEST 2009' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_with_multipleRecordVersions_data': function () { return { + users:{ + 'catchAllUser': function () { return { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }; }(), + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': function () { return { + s: '95ae437caee9bfc2a2d716291c2d4bc7b6412072df45a1403182d65ab62818ad', + v: '30cb1d4c26a4b93f9303685f2f08d32a109411044a1251ae3cf82e6032d18c0f', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e":"0","5931d708fcdd39af284d4809135393c81210a10b0e9d56b49b2f2a3b8adc9394":"1","0bfcbd6662f3771f114295df779a4e4535e8e666842c2336da1b095ca1def657":"2","2eff872ebb19c0f8430518847dafc819c0bf7e0cb714b456d74603c250f2efbf":"3","983f262760a45171a8dbaad13a7c87b8a3dd267d1cdba7850b07e58af0460378":"4","f8141d3cd5cf93f3ade420838f98e4bd0e5206d202b45a24822afc9099827c17":"5","25bc43a5f1aa780304bec9cf0cd61502f82243053b5f72a55712525b0b8290e3":"6","5ea084cfa5ce8198528f466e160862b4f17d0a4f63d3af45518c96413d16fe69":"7","b81f9a1d9267daf4afb786e8d477c15aa3e1babc59b8ba09bceddc700116ab0e":"8","d8568a483a8f443190ba723b391960554962760cd886b2484f2698816beec530":"9","42c7a17479baf21938c87af38ccc3ceb3aec21535c644f6c90496f89008f7828":"10","63e20b19028b7dd1465cdeeed60ca75b5f5508cd01601937ae8b0d1f981057fc":"11","7cda06249cfb102884a133952770b85d5442f8049db132d66f761deb765156bf":"12","166d907e97005cbb29efd1841757f7d1a57210ddb32605ccb6841f35f72399a6":"13","350a8d666e033ec01e203e0b6df730bec53124f9ab25f7942bd9378e4b5c01f6":"14","a0d5d8796793035d1b109654c68d34b94e2aa64b5f76d50f01d9a18ab1cdfd5a":"15","91dee4945d6660e7c0db77b72fd2eed3372a46545da1c1e5600a80efd554977d":"16"},"data":"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"},"directLogins":{"index":{"03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"0","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"1","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"2","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"3","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"4","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"5","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"6","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"7","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"8","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"9","61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"10","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"11","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"12","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"13","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"14","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"15","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"16","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"17","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"18","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"19","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"20"},"data":"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"},"preferences":{"data":"XHFpIEPRLRjziGOHhPV+FN/EWsxs74xco1JuUAfNC/6frao+PCn03q/K5Znk9mN9sQ=="},"oneTimePasswords":{"data":"GEy1evbARX4ibdMDLRHCU2WMCian6ATOcGaw4HvRGCKyKt2Gox9ZCGZ1vzaM26PqovwcUJ30xvamvtj61Mp+VZB71YJ25irL3eGiqHplx6V3sf6rCx7EzJBPjykzemuRTI5AgRf7mkVhNz2qPeBtw+Xsm33I4cK70ST7ybh8EKjok5UZOgV86EKSxv97NeEsfhkumSzfRQ7zGkT9vjGfDelPUss2QL9uhjNvm/WvabX7YVHWM1qMgxsCCi+Jzyjl9kNTt0x3G66xUFNk+Mp9GgQcz24S8HRJj0S5b9F4YRhLdUwI8y0CHk4uNPaa6VmWpwLCMEcmdT64uatmCrC/CdLrVp3UasDMGPSqic/yF7R8PR4jrvee3SuIf/NtltRUQU5JT+6wwLYwdR0LEMrOHpXZMg/Hf4V0UQxdNdH4yKOe8H00bbg1DITIL5aILVu3yGFgxlrCBTPW0OL+ql8TQukEHZ4PdnRvYWKzm18x+mmPBi5enizxoO4Us+dYshXzvOoWIJ0VFcstDZxBJSvrcWySsxMtWe37DrGD0TfFGTDj3Gd5t8nPYu4JzBOaESSp9WKtKdw31uh7wynAeuGh61LqHRWS9S5ax1C4atdYHma5Qcjk6QwLtBn+MCDOnJqvAW60YW2V+bGptOz9/nQO+cUASkTQ1uOQ87z5+3CXIsDbNk9T4gEbPqdWS8/SiyHkqarIrVkFMCqncTqzaU5wZ9l2sX29QZqJSt/NYTYPyhTbKQ8gKQOVSqXPONewMdSOsP3+4m2+JPbGUcfj+cWBdQGwoHmLlg65Oa3lWLP0s7yjpzN5Tg/M0h6qhmWT3t/6pD5JbFA6fp8HYzRvo9DC7G1KhRd6uvYUTXkzOKzxRuEzUMciV+dvfY7c5yFEnk4VrM5ssMZ5+CGGgngFG6Ab6epTn6PNmW5HTS9WoEpuwqoNnAPq1Bvv0kSK03EwdrgTW73e5Bw0xTOfSMaIWMZrORwuEf9Eus3znkT0n7pEQhpStP921M4wxT1rO4EGGXHgt/4o0OXoJfF+lgHHl95ZmPJAwxxvwH+sfGlmp6PTycyPsox50GNmkEuwSLwPLEra75YEEVQSvOSM9Wua3ed9J6LkySXd89IjNA432m2qFTXzsqX65/Yi/88CcwDt+mYfSuvkh5aSLbLtNNteXv2BirNq6QRWN4P4CA84czBnZUug6HuDHsIR/Hl0X5Eip6+7tESxitT98sftTry9b5VmxHRih8maSfrGjWCqH7Gkax3i4aQE5ErKwxgGzP7PxrWWmJeJXOlSzWXM/+iGszgHcl0bqorMvWBJGdaSQT4TyOoaeyK1UWZnsJyw4KSZJP1wEGIYAWOs1lnWiT4wrqIR1jdZBRGk1fKQ9qRwLrKzPOMeNvHLBIFkbDdAVYY4ScotmNXqSs9dWLqHfg5SkE1fAg=="},"version":"0.1"}', + statistics: 'm+j5iQXSMKvijTYJU5v7iNLF', + userDetailsVersion: '0.3', + records: { + '0bfcbd6662f3771f114295df779a4e4535e8e666842c2336da1b095ca1def657': function () { return { + data: 'u49WrgrQIWQsB/ly5AQAmi/RixI2rGkp0JZh9DlBxgTLOhQ35lNVa9ko39zxAXqNC9ZGD/OiQz6kVT7XAA/anrfctPOTIeXEeQrTQTwlHBZ+9c4zq1ZDNP1rm00v8sr/dYpqJmpQzEko5qdaPakxMe+gag6FGdN/FbVPBbn0uVSkpiIZSNpiWEQ0uHjHN0QqfrGTQ6Yl2UeNoe9P019XTDtfaupDZwh2+DL1i+s0UrZqa6JHyXLnsD9Ue1S4muyFtptJjasNPjzSfs+BHhQj8pIpZWEEVhH16Bb3fKlr6crRktEau9uAtEE5bZbPXTDrPi59JdMYmD5CH5ftDxz4nIPuI6Y553s5T6AejfbFIX3QzMG+isJ4SDebElDCQDNBsmavojxjegZ2GG1M/xXQ8Cw6pELlJBYPidfEJaSjb5cmo/eo32OLLiR03PpQrpzqQkzcm2Eh3XrkVx1Udg+JtrC5V5t4H+BxLpk8oTbFhXVDvQ+zdWuq3icrfb1zOd3f6b9GiXFu5tqAq42xTInciZr7pPWth9yeZ3fYI/Fyw+9F2kuowy/MbB4q1TL2VjxT9WfWmIFoLaLRNr/w9E/RsvgTc/LukGb44AjPaVFckVSw+mqpAOqvtZN21kWkJ9rQk0W7CQ9tRYRfrLhWVIu9vwPkjyX2o2t0+ES810GTPNesbbGAsxlo2CC3a1GZLebeF4x+h0v30ShC9UJLhxAMD0PGpGYjc/AOkjGxTPMKLMvyA9sKKZU7PRLQQg2vFGXWIYoK6CHFBJey6Q0nTDY7Nomi+nMlQv5f9BT7YofNW2oib9wQmyS1hwBSCB2Gavh8fd7zPjETCCURfDMfuMlqRFgySiOpl+yYSHLmlBl4S6sIsdU63uyy/4QMQn/SLGh4ASnhI1GRCwODVClachEbt6D1u1JInPQtgBXyNiuKc1s5gZ2WtVB8tPfkSfUIQuuYjK2N9aVaioaWhwSAIX771+EaYMIrVeVq+twakrkFkgL8+YHF0sOoZ8ddQivsWyfsMwDAzHgGk4hMdYzr2Mbb8ee8p9oaZBVqZi8E3EM=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:10 CEST 2009', + currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a', + versions: { + '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': { + header: '####', + data: 'HnjgIcyk9xbqzbZLcIx1BLpcxwQc7hYQ1sHpaqrKVvzx/CFeGGWTmLHoy/dA1wr8/rAUPqvaEFNjZBDfTQtYNWQ9H+Y+YzJ54TmGCQY2h2HYLSCvJWRlucsHKcW1XLIwsxLzBdtZK7AkR1dPRd3s0GQDH1pUcWC7WC0thJM4a2X38lILzxXmoxdqQvawNAeVwscokb2Z4+zQUMLdRt8o9v/CTFEsU1jzrxVSXztrhBzjkUga9TUVcYA7BpOMdFmeevvfRoVmf93BL82wDDWiYIIb6NoA8SjIK6Km/cmovGikoPjUbOErvq0TaKuC6Gl/nUpqnW4kEjR0rVDh+27AuMiJR6MPdqjAYAk7pN8vvfTk4GE6TGxl5IbLbl1yZ/7HHC/CtihstANOSwpdCDpEXLK8', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:10 CEST 2009' + } + } + };}(), + '166d907e97005cbb29efd1841757f7d1a57210ddb32605ccb6841f35f72399a6': function () { return { + data: 'QxBwxxwjNGkbV5L369GEfAGPghu3xUhmQJi4r0dhbAFscS4SgvfUPuQmX/JvDfWZFBhAHGunrPxHDDHRgx7GVVI/Kv1oMexHKbPuxhRSBRQz2HQlXDAUctW1uPo2xEbDHGr3JaCiqnHltp9XMkmGSP8IYwgizYt+ZwRllKlmDbVkX0gBgM6WzOhP5zekf0E82XauOc2YUW2jZQEKBQ3azi1kKNfTzObGL6NK4awJBlB4m+R8xmKkmybcbDOnnUfo6rXxef6KLyd1Xq8wmmh2oS+I5sbG0CeAdujbhrpJNZMkXFUjKjRu7yCrCU5rUqpKGcYUFtsciFxcklhMwk5uQmjLlKQBXcOM6lmw6OHRwzE0eOMB5iPQF+gRUo5EKdRd9B+lV9QyCJlkTgQlLLQfDSdZ0xAoEe2vzJ0p2Cijg212w5kGf7vEtQrYwb6GAlfeJiYtDKSkXXx+ltpCI8RLOXdg3KZDu7iobQZ43I4MA6QELhGhc+GeRzvHnW9rBaSdxWVgba/EHAsTVq2VSt5u4Upm+WMyAQ89VJ+JMUJu2k++tID9ZzKF4Cfv/DfP+WLGEmZFmfUldl7ot91HFHi9kH5HGgqbkqKUCHTwDyJhQM+2NAed9nPVnV5EKv1YY5ABcVE7M9FGEIVaTlPCQ4Fc2aKD2tyXuhmXlLKK3uBBsSQ3gn7NI/6s1vIDTnWQA6uzUo+IpadwGwcUd3F9TfQ2yckE/FuWq5WNeLV+Y2OeQgLZSf3y0/sqSIhDOhowNMwppZU/fS6Q17iVDhGcmZn+frfNv53rZAOg2zWM8kpLjTOtNCYsToR+2lR3hQuMUw8dJuNs9WHCywj30J2t0FEuLt3091TLD5S8mufN/O7wjloLOH0FtHH7zufyH8YgKm2KNgUHMhopsjnqp3YwXhXgk3OfD55lSaiLO01pLP5kDfNXsmUDyK9SF9gn1pt+xTVJ+ndZiFxzuFvPsASiH6f4Qp6KMoyTxl6w0cIHVZ4e9qHcEWwvTfqBHH2O1KPvijTSmlcZ3gx3HB3zfI9hrY53dJsYv1Wh6mMe1KKT+2ioTlkY0vuR/aEiD/bDJY1yTQ32/TlY5wF4trd3mMeT4yIOPjsMWPLy/H2bF68BOd7QC5EACoik0EGBy13yhg==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Aug 09 23:43:43 CEST 2009', + currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926', + versions: { + '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': { + header: '####', + data: 'InmPOw8JYXqygmHyo1pTce9ig7lBEINjEXHBq3O3JIJxF1+kI1+I7bMwBhPJIu7dwFgrp84YGFzk/rf8i89/55c0an0H5DASo2tyE85RZNA98ZVXDEl7fg0FXvi74248V9vfjqUajSc3z/NJb6ykHLcrVLIDupwr+0UsWXIy3jYrLhpSRUWHKMSnCus44BpqmBkkDCTvHN5YQdjGwGcevC4L0g287vDO8i8rgz0P56JwiEF9yB9jtHMRmHFsG+8RIi0xPAPGJlh7pfCkNqhx/A/aGUjB3K1PVw4z7uDzrbF0YuhElZae6HbDu3ouzELUiOV0YijpuT5Mc6kq/NIvxWenrSwNx00kAGChWScG+SUTOyCPmR7jEUHcxGS8jvaHSPQ7bkr+u8BYgPwVuvHhReQp', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Aug 09 23:43:43 CEST 2009' + } + } + };}(), + '25bc43a5f1aa780304bec9cf0cd61502f82243053b5f72a55712525b0b8290e3': function () { return { + data: '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', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:46:33 CEST 2009', + currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec', + versions: { + 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': { + header: '####', + data: 'f/VmR3IF/aryj9hlTaXlsE57o/x0jsH2ah+qgc6VsOg1/7xa2qtBQRhOQ8RWr9oYmjnarWqkLVrVZqP63O+0dOTmwWHoSf17dWlSZVxErV1Kmb5ojgFlkbHJX/RkcgPrav72fk/A4yJ7kb1FZjTvGNPMpJCDvSA3VT+xEukGaIig1Zt0KRA4BZasYuge2Kr97yT7mPN0d2EKeM22Ybgl3Vd+Ja+aWkTzkLLo3pRBDxFXP0PJrVHFG3hDpVqLn5/EGZguml95TVGlaqRZfzmho9VHduO/fQpDr5jelWA9ZDNkQhxyA6LlOrZjcidbyEsMYeJqVdVXa4vBnYh+WM0KJIU7XoJhur3DMD6yaGc2wAX8dwM5zyWTaseb47l+OvFkpBgstqBnIBozGqRj3ATG8e0=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:46:33 CEST 2009' + } + } + };}(), + '2977aa5f99a9f6e5596c1bd7871e82d7328c3716c9ef8ba349ae65f10d97924e': function () { return { + data: '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', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Mon Sep 14 10:19:04 CEST 2009', + accessDate: 'Wed Sep 30 18:23:38 CEST 2009', + currentVersion: '6dd709033cc5be16be0ed897d0a7f8886f88f50cbaf9eedec8638fd7b72fffd0', + versions: { + '6dd709033cc5be16be0ed897d0a7f8886f88f50cbaf9eedec8638fd7b72fffd0': { + header: '####', + data: 'hhwId0LMOaldpCUM7uGnhMnjE5hqoMV5DbeA4TsGP81BXevlGklqkoQC3erIiXSatq5eG/dyqDQrzyzkrTl95CwINRWYmXHDhaoH6LftAeSpKHAzfpfRBX83MR9HyT9Ypi8Y1j00L5qEqi9Z+0w3szwPT2KY3ejCsgZAM8NaB/8y3sBbU+fc4sUZtWLbPxocEeS9H7uNBE+NSWjm3Hw5OvfU2PaAR9JcTy8B0HyL3h2g6/QBCEEnf6QiR0L2tfEo3iHrsyVYAdNO+P4nM/vFALCLEPCb/nWstS6tZu/u5q+KERluskP+EKzGgDwuvLwTHjq6n9mXs6umDWmjPmJBefHYQRCYpKMUM+CO+3MFKkZJ2GXExp8ihOVdHPh+zxQlke7rgO2doPJwzLJ9QKH6rnovixYkt02MrbTLNabsmXA7ystuXICcWlSRzds3GlghTdvbjnkgqcGxfzja6kL/ERSx3yq7rKT0cC3O+hWuV6zWd/aYUDnCVbK60gUAphUz/WWCfCMp6LwfRXFn24njkfkPfp9uOKYPMsY8w+crlPP9qBYrVTjX9oyKIC+f', + version: '0.3', + previousVersion: 'fd57e2d2e48e6ef8db89d8b9ad661d01bd8d49a93f726050f84779f1ce2bab11', + previousVersionKey: 'sG96l6ebyht8o5i7Yt3HxAuZe85AJq4ul1cqFmjjzKe058gPKAN0QM0BEoa2xlJxIoXeIrq5A8QsHGPs0iH3OlU77RgBgHUG4TZt1QMyG+Pkow==', + creationDate: 'Mon Sep 14 10:19:04 CEST 2009', + updateDate: 'Mon Sep 14 10:19:04 CEST 2009', + accessDate: 'Wed Sep 30 18:23:38 CEST 2009' + }, + 'fd57e2d2e48e6ef8db89d8b9ad661d01bd8d49a93f726050f84779f1ce2bab11': { + header: '####', + data: '50+8kvNBZ610YDniT5vM/2VKaFjO46eVWBzgz/kUgU5RmwSHw4PJlupqBRT/VM8UN8NVliS0A7IoSmIP1QWAb8n2KFi2e0V6bYnrso2gPZU4CIOW8Xxh2I8mDci9Qdo9kZSvgB37vcRw+QuYXwm+SjCKqgieGcniacVB37/lcOsGcg3I/o2Vb+ZgXbyARKS2vN8/I/XM89/0t/OUV/4+PUvI4rCHSd+ML/0801t0t9YrD9yXEnIEGl0YzHB5KQebMmhCgLWQKE4NdPN5xnPxtCXRQakGmycUkA6gPzizpBhrRTcObFeQObPD9E/T4UxICLEespPy0FRtipB13Ql35CZbc6YOJ8YbRBXBy9tzZfiP68dabGzPsQoUdhTnudqtSHTvgZgeYP6Y5X7Tl2eaAZGf', + version: '0.3', + previousVersion: '41e02b4415f5f802c6aedc21cfa873d1a6fd301b351ad064143609280c0be870', + previousVersionKey: 'Lhb+2Ikt6oJ7RjzcfBKGcdw58j0p0m1U8vT8fVlPhz2Qgfs49PB+IFDJx/CAYfVqn0XugP6G/C/bt7W+26QIcUywQQMYGA0As7wQlAyntExBvw==', + creationDate: 'Sun Jul 19 01:31:30 CEST 2009', + updateDate: 'Sun Jul 19 01:31:30 CEST 2009', + accessDate: 'Mon Sep 14 10:18:48 CEST 2009' + }, + '41e02b4415f5f802c6aedc21cfa873d1a6fd301b351ad064143609280c0be870': { + header: '####', + data: '/sQ8oax3ehuArmnZEeX3xiqqDlFMPNgtisChk2A6Jj3jqk+MxC1Y7ioYoY922oyI0lZG23IUHsTvDr8YV2RrIcEMXPBduPl+XcnmGpL65ei3ZeqNSji9Z/i4j7w1JawQSSfnppB9EdE2OQ8x35PnWCIKKDS8pPXLAXnJmnlar5UBhJ1vaTqQY5mi5OCCDra1KTpcFlGQH2RfX0Kl2jwYzFxqUNMyf3FM4hs7cvJcm2yYvvw/c6V4QwRIiANoDjSQjtarhK8dULMJWIXIpaHUkBLBlxpINWkGpGBPyY77CdTOgA4UB5icgZZA5lfxmkHubIpv3QegAf+TKSOUeV9UWmHj64ayHgYjQ4NB7XfSUSrnMshn6q5zY17TlM/b7OEfe2RR7xUonmNgw0ga4OVzYKMT', + version: '0.3', + previousVersion: '5106520ab71f92eabab279abcd41289831738439fea854d122da13c2d604bdae', + previousVersionKey: '4VhpG+IYuvWSUkAP+NhCcFquszJoBeuwBL3A4HkZz6cylGHu9UBjAsn5VWidptcB0jI7A487rHjVmqOdP/K3MlJqVYSNEVzdMjAfkPgZKSGrbw==', + creationDate: 'Sat Jul 11 23:23:47 CEST 2009', + updateDate: 'Sat Jul 11 23:23:47 CEST 2009', + accessDate: 'Sun Jul 19 01:09:01 CEST 2009' + }, + '5106520ab71f92eabab279abcd41289831738439fea854d122da13c2d604bdae': { + header: '####', + data: 'u/iOk4faLI60d78bNAf1i1/zxImUkdtjS5K+gQqrNRnqquQMJM+FV8qPDt9vVGgKijB/LCgl6Cfvl3Pur/do8V+X7V87fROBjD4XbmMnbG3yBBFgk9snX4upCAkoEL8XrxOY1UyoR0SiLMI/9g10PMRyLmQVCCViwl9RRjcHgI7YKekXPuVWwg9uAUV3pdOamZpyN4POWNAk4QpxVazlK6UoJZ76IAq8UUl0oHbzRNWT6d44LZzWEbsss4SgVf+7+mFMSwKxB1cVm+jgk2vcNs+txAg04EozT2cJGBsiYDqo3GrA+yHTnhdKO8tRBLBsOkmwS60k4H8REZY40xEYF2uYnZbOmBUJPUUOSH44nZ2cD+3C6YyK8GmOS/8ODd/vZ35mCZzoCnHDqqpvogsBv5ks', + version: '0.3', + previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7', + previousVersionKey: 'CNxkOXhTK/SCSZnj+MD4ws83iHGVfl1iBIfkcAhnMeqAkft6IoQQr+r73aZZDRCLDkzGX4kT9iKCGg1qwsrs+EjoeXZTrQH1Iq4J5G3sFLb+jQ==', + creationDate: 'Sat Jul 11 23:23:27 CEST 2009', + updateDate: 'Sat Jul 11 23:23:27 CEST 2009', + accessDate: 'Sat Jul 11 23:23:27 CEST 2009' + }, + '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': { + header: '####', + data: 'PPGwtNXTyrZpCY1GKT9/u0pPsSunTuRFhrPfld89swJtAeNgz4VUTXWTT6z0fD9MxnaxsxLhpofDBn2mEYnhQ5ZptSKd7/MYrkVLRyMBQaZ7tPgaWVyFZ0vhJ1et662H5Qj73reiOYuKmU4KIqydFSupgjG0awc0ZV1qwjyEwEWgopwXvrhWoFveGSrG4XO+cbxnb8ek1sRKrUVIQV2zhE6S0QT6PCl01Jr+Zd8kW91EWV/PtZn74rJcH1oBJ34WBzBrU6ARXutBfxoYgwTsOhRxH9Z0StbMSRAsBff55cOYxwuxQQCXsOWXwoK8uE2WHAG18b3DNuTm+jluNkgfUxgWZ6B8gMlFQ4hdgQ0gfWknq4+ZH0xR5TTAOBegel8C/z1sqT+hvdutBMih4uXJLeZO', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sat Jul 11 23:23:12 CEST 2009' + } + } + };}(), + '2eff872ebb19c0f8430518847dafc819c0bf7e0cb714b456d74603c250f2efbf': function () { return { + data: 'OjA3UmHDbGw95QFBZ0LMQVUgqwpWy+BM7a4eZ4FY6mb/B+fCl31PadGg6+Xp5E4zk7V4GEwnxl39aCQzmNQOsxWszVZ/7eAIFK+mm0EwmpC26hIrrEZ+8yHW21Oj/K9FBpfPZ42768cWh+K+dLQw0833n5b6UTmrOswJtzQiMyCoZ8cidw==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:16 CEST 2009', + currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc', + versions: { + 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': { + header: '####', + data: '9FchrEXmKOmFxcCcGHhOQRhDf+OWFABlBt+Y7FoQWvmjILdmlZeCNEK8tBrVQDQH+SuJ0s3EHfaW2dQ3TRoe35E9P16lJiGclRj59e5f6tngE0wD4gLyRQnF9TZJTFIM3dYlwjhAewdonyh0uEnAtdZfNaeCF5xVjDKzfcUVyxXIJLa1+wdJde6ycsgTaPvsaJZ0YU+ZfCSRAiL2ACnVcjWjT7hFMQMGnCFQOMJz3OsA6+UWvhvXebdDWqVg4j1h9Y/FDllCYtvIg35ARlaJERioe7+PZiN+jki/XmoEDzd19BkK/AKB2DLC8dPEj9uu7p5r4WAxuA6iRbXDVO8HlkoywstDAKtUj0XmAfHoX2OJkHQjfYyuqabkFCQO0227Pk3vFTFnv6dXecBMLbevAVoL3EKvHpJWICL+mqpIGNJUqgDCGJEB4rob2xBNRLyExgkEmbCKoN9ikFO/JXhDT2JOSR0fmvfcEFor7exicL4HX8zgaokA3oXwZptc2Q7wTtKJ5ipen0E/2uv2rjCgTAK6vFHxgW5Fk3AGG+a2YpDedekRAWNEJdVucimepL8LPEe/GOgf2kGZqb3L', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:16 CEST 2009' + } + } + };}(), + '350a8d666e033ec01e203e0b6df730bec53124f9ab25f7942bd9378e4b5c01f6': function () { return { + data: '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', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Mon Aug 10 00:39:08 CEST 2009', + currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a', + versions: { + '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': { + header: '####', + data: '8TVTh0Tz2AUS6OmJ43Gp1a5ZYHhryqoDcESx/EfyefERs+AWtMg/57XKIEi1GPCA+jllOVmaJ3rnRaEN0VDiT2lST6PReON+IFR7WtZKpPOMit+cF+7WHXM9RbYsJnf00yyzRzF5xKPk/OiP0QwNOnhRrn0UUzJ0akSJS6WLJrIDF/WENBu0szn6I5g4m9v3nUIjJcpsM99BOHS7iQJmakUUQuIp5MPbALEUHmTWLcjmK+BVOctdfE1uPor1GAwgJTQ7epQX6PSPKsyPJEHgf1C5OvCN8/X0IzXdoXdTdyBCh1RaSiI+5Qjp+XHa/RK7oRjVy5aMcpKT8v3bDBlTMa1RmALqJCMDW0lVgjtNrDlQ8mxDOF+gTrDOsLiBv3oHG1H5035E6cU4TRu2xLDqpGKzJ2uPSkVwvc40o9+Qk+Zi6iAx0b+0OLF+Yy1KoXP1ltznmufLBng50lZSueYLrCfEmBfr6e+gc4VZItfGrd5sTT7IilRs7gn5+gL5Xhe5sQ==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Mon Aug 10 00:39:08 CEST 2009' + } + } + };}(), + '42c7a17479baf21938c87af38ccc3ceb3aec21535c644f6c90496f89008f7828': function () { return { + data: '5P3FrjzLuEW/pVXRA+eGyKmcmD45HXgsMFS2S5SVnKDSA5mH7FLnCPsR6BGClUNZQlB3iU9vG8IK6iIY1v0m0m9CTM1Ubk3dnDOTSrCi4BTH0vknRvBNZK7vJaChSjH6QgYrRzp85hdNPEIqjZzL+An66dFmWzphjAhCwh33s3QHA/gLlqLaxexPqcTORsyrbSzZKlpRBAF7Hb0gDHKs7YAPUBt+dlW7ZYrxBtNIGYZeh0twjza02AnOhOypsIgJrchYXzJ+wXhU7PPPPwcRKrUjPPlCzG/0+l7E6DREf72yUzIEV6IVyM3Bo9Aii10gRpxeU7XwuONfQExBjxJ3QsK1+IK8k67WzAYYUO5gu+jV3M4NivCpoYK18DrU88teIRgoGry1y/x3gzrHKZOuu8w31/UrcGw1e7lliYxYbEg3eje/znRYKCjFSVZ4ZHHKqXshGPLkip+dAXiKmmdqmn8hLQPrbxTGAPTrVXdM/WyU1NMYtJJOzsEDNTKMxIfBXnb1fRVjOPDtEpuU4Okf/FiQ3fOWkjFWh7IiyFoeKIVG58t7juvwiwERaw4gfJNWtdMAiTvh/o1o6qRAtnmH90+OWc/V0no/fr2xN/NWSBQqv3e6/dj56V8b6wmvu6O7geXF9+n46LfzMDlHoBqS/8tGy7qDnZo29TaGbPoXUkvteX7689FdOYFd66WmSAuoNddvrqogWBCMJSwiuaFpv2JAzFtWNmQAk/nN81TFjnTeiK1rl0drxwPR94Z8MiiiogzMUIkbmkGciUtMfWpUgDNPryx9gXRCCZQZXLh6EfspgahFykUXG6BwviD7jRa/1TFg4xRp9VWuul2djQRUMEQnZQ4q7hu8ZBpBvIcgvC4CxqOfcQrYMAD180UbdxQ2xJEPA3DCDQpZNWzLgJ0m6FrOx87x4/1Jyd0LaaS52SxtQCwqnusNut4dmPFKHTiPGXSuDADrlxeL/enOAXt+j7fjE5SXy4bVIGqeDv2mT8yPUam+b8tb5SNr+CD0HsUB2hsunUxjXVwcJ8Z0JBrwvvVtQAu17rEv3EcfuxFLYB/HwqUdjeCfu14/RvblCxBaX6+lAeJ4rCA8dJWbl/ckr6GkbQmGnLno8uxPrq4j7E7Ia+itowZSeJ/eLlyV+owhbILoVjwNeTqi6pkiH4ejM/+e2n4r9wB7duOiFPKnpEt/SqF1YWUZfzLoDikdzoGIERePNKzlSEa1m0IvXDxJtADiXcEzGrRXS6mnbIt+yG0xX4EsCmDt', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 23:06:32 CEST 2009', + currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28', + versions: { + '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': { + header: '####', + data: 'cMMqKK7G+t292j0PUNh4gtooVZqEkAoY9B/vKa6FEJWXCp2IfLOSH9sU5xKnlX10NGYV4xZwgidPI8USmCM2WUIcv+ffm+6OYmEQKC1TdptcyAh32+dF2VS01V1Hb/HmtQiHT7nh1IUaV6qn34rTICtLKIfei+AoGEjQm8kwKNzNxeX5SnQfafKCmKHH8ag6SxKPggv+ucO/ECz++n30nGpjwG/tWCyMd291HfAQkseloFTPedEgEmfRfGrNmsq2iwtwKLddZJ4xvY56H8Ppxo483KZj85AuE/g8vS5Qc961YtFjA9xbE/BSchXYobLH9DAoKYtiREyfNCqHYh1cxhqE0Tk1f0+9IvGcsB9d6fahhTfQERnUAd+f+C+hsx7rMfmub2z1TTjt1CnvCEI=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 23:06:32 CEST 2009' + } + } + };}(), + '5931d708fcdd39af284d4809135393c81210a10b0e9d56b49b2f2a3b8adc9394': function () { return { + data: 'Yr0K3VCx9pWKSjRuk0JTO8kyYKqqYBb2xz0nP4h/WSx3is3bSy/jb5dWJhI2WKNdpK42eP0jfboITWX/4Wdg7HZoLv/usE8ld3MGKfxxzUNZDIkW25y7Chq08wFxvv4O0fHM6QyFmHQx2KRQ67e++pm3Fuc5CBl4Cgnqe9GPtMnAVJdaei/eDK2icOJ6EldBb0NGIaX2TWE84efJPVNIZjQ2OXZmLse0baim7TtS4HXljZSBNHob2v1KJ/sKh8xvw6dY8zQBAalo17Vxhb7Gd9/Vd2A03GNixS7WZAYP+ybd3lZFMMBuNXTG5bVRaMZv/hnjw+CLak+tOyNRG+ara7GivBAXjgfd0oN9qBvvM7aSm3iFV1xQkxBXhv0/GceSZNE/uPdJkUCQutikv0kpsDxWBHvPI85+8mBmzgF+aT0aKRTTnQfYSBLvPspopEv7PxhwIdjDBJPrfkAMUFuTSnZ+hriDMHoYM62Kh5anX3jYXIPmrRRuH1NN39FihR4uBNacZPEiFKmFQu2js6ruCNzaLkUFQIhu2hzdnQt1kOIG2nngruI7SEt/b3YwHIh41udtve7qKWrGaO8IjIaR8jgCtxvavH6NaRWIr6Vx4cgvqiyMAZUewzsCgY49BOWWYBR1FwcXzk0itWH0ZzGc8htlbVJ50I58Iu6Nfv2IGQvHY87arTAbx+sUNxou6Ht03KkqaONFEr1/VkAaxTNsTcuWFArAKaC25oY1EkriGUC9frwvJyHIRBSHyIzpbbtO2/mnBG7gJZUxAtEDZ3Bb3AqP6v/3k3N03pP0Y5HL199iLeKTz3pK7sgohrr8IVM1XvcsaVyTBZ3di1E4UZVbyxbrMIyR/+NMu1ZqlwGI0wjq/emTvtDEI2/l4WMxMIfQLCwdSjDYi4/HVZJvcyGNugS2gUf9hwavz+BUnV1iSI1JuxQihby5LY4Em4Hr1st7hqElfZLgq64iCVvBSzOidM1SE3lm2l2/Xx0SvLKmVxt32vO7brNSrBB1fQyq/BSOwlp6TbhnPKbh8aF+MIjexwPLU0wfs8rj+5X9j5djBKVtlCqDFtlvng043oC83lvOdbyAeppNXcloRWH8gB0+orKD0VCMMt3NTCJ6xlrDeIWqKjn67ucXub1LB35B4mJDbUT4zYWi+YWAp7QdFbZbWJUa04BzZOY9ggtbdrznLzQOXnek1gqEwrNSytvVPaWoqz25KuMpb7niKwQNe4d20f9GUMyjFcwjwlfyfwv8B8FujQ/3bCi+v4R01UirsVxmRd5ESOYi9C945ErgQZX41x18n7a4Es35Bnl743w4ZdVQw8/BpwRZ0pKe0275eDw5CJv4gFdsnTVvAhP1SqG53sREsIVE2STr0/B9cANQMjFI270JKKVG5ckYTueak3QlcqW4DXQE0wkcU59wODSBiiItFDKtZAk1pKll0s2jnuWlW/WP4yWddry6uMtTnj+j3uLNcV9O0Vp2+v9rRAEdHCymEPkEbR01Nz7FE6xRXnxnfn2xQP0N5KVZvzXMf3evbN0bEGnV9kH/gIHkiMr1CgYJeQDGcxZgKtlxqD75OV7XUSIAd9b3+j2aDmjf7a3cZrvGjkSHNBVTyPSwsIw8/09Es295fGLKRu5ZfwgZD8xjUfErluT3QAkx242RkhayNPn3yRNAGzmBZ3t70N8dgVG096lZ790eDDT1fUdusaIxAGlPebT1zZWS', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Fri Jul 10 23:26:41 CEST 2009', + accessDate: 'Wed Sep 30 17:58:49 CEST 2009', + currentVersion: 'e26bf4c9ae24bc10a265f594b0d75426fc1664ff8143c52d98592cf1c68baf5f', + versions: { + '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': { + header: '####', + data: 'Q3Z7AjwPFzFuRm7BJSRnd8Y1/tEqXiLdCxG2JCurixClv8uvQPQkCECmE7mn0OqMRzlMStD9UojsRK+cxsaNbQn3OstaOgm1OuZe1WLg/oSM/UfcQqfBRmCtHwKX2zjRTSzCjNamwV4n/l1/92/JOBeydVWe9pNe/WvjjfNYRRhTWViNnOaOAipfLR3uSbehgUlQ1NX1y4nrC/yEDge+73BtJNJhb9FOkKGG9ySf7vax0fEo6jVVfyV8KKFmXLL+ea0D7CoiyR91eeTKZ3bGzU1MD3KGXfPorpCoaoRK7OKrHGHGfAmNK2yAGhJ7rFnTbkna02tMSbdwHaEXVyLHejub5L4LUaqTSnAGdmSpiVEpkNbD+K2mLW8loZcMUetxFqDh5ta7/IEnPMicmpSOAVlYTW2ytpLppvU6fFKAtGdJ71GaLwQzgfKE8ZJOueJ5WBx990K0MjSXZcsqEzFzGjiyXpIBMYwFDuRwTyoxowgtlL4W8DTtrxW/XA2j1esrMXS3Bf2g6ujdSPzlve/8nimW18OkRAgPuL4seEySvs6GKgF4CyR/TsIsche2kWJ7XM3eO7Bh/Wxu6WmNBjUUVbjvOTF8pPyDkAfEIhXhTliHf6lDkW7zQs36BrGEPfOC9MKjSlX7v6jgwX9gy1ToSiht5OB77G5luThsGQhEBkydw1QGZvcKkblrzaGFznM10RXbuVyfw9HnMQQO9h3aBIgq/yynJAc+uBUtfPsGIfXbotTZ+bN/y9mNl1gng/gyy0732IS46Qikov/7KRpOv5RrosTCYaU+WrAn1ehbMzd2xFlNcKRpQSGQkVundl3A2BqYtRElJCd32FUPSfxo6gZZosI8s0+GBiRjIVihPpglE5uXk5vjbsCEpahm3XEMEpqGdyXct/blQqEsa5o2NrvIlNVCbsDIKYZ/S31b1BjVO/auWGILqzbG8RA0IGZEJhyRTx60dJEHZSayGlunkgU=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Fri Jul 10 23:24:14 CEST 2009' + }, + 'e26bf4c9ae24bc10a265f594b0d75426fc1664ff8143c52d98592cf1c68baf5f': { + header: '####', + data: 'ITaQ5yMCeVUO2140QTcV0Fy8ucHd3zRohhgU0F9AdvWxwVm3yjZrwjZWmnOS82bZ3y/ZSrz+HGhuxuk7+yYOXR/Gp8I45UTrxFzeqJNJdWurpH6SbBGtd2CH7wHM4Bi7fUBGR9B/JmUbrTO7iT71N5MqZ2nRxr2vvCBXMcOPlFg7SSMDw6eFqDAAn6iMyaQSJvntLvM+WmOXB0S3OgUdhudUihK+Eb5tHPAy2hZKpqjavjxdGUiBEJoegUwBiv6SbCjTCDZWNXeFviw9wBJoIhSUegokGr0lNGQqMq1BpNHQ58m+VvIF2+qhwGq3UGd6qfyb75DwXQus+XezIQNOPFwPYW5uARY91KBgyIzB3Qj7ATpDVqPiW8lMs3wHXg7h6em0/FEFWonzVnoAx2HWfU278op1XQTgSTLn2DxFfM0vFeHRfb7tSwSNG9RNb2hi/cKaz5GJEQ83MO9MwGznSFHwGfn5fFW6ZZLf2cn0l1Y4VO2JjGDwy2HD0z+K7LdH+lefW/CyMmOKERnltHnMIDpEOB+jwhBj81wbU8bO9C8vc47myNtXu5hROIB7SDcV29Ufg4kXU48gXlaPuyiS4TYiM3kjC/F+6+iWkJbyFtKirRibGBIKvitkBIYkSJeD81b9IN3Y032bpZkS4uT1oELFxi1ZPWeqayEYSV6ZezqprT+t1PLvtLokKkVerbGhC0FXKkTQg27YHUNOZ3qJCXeSFEXEIWKRrHAlFvavvdIFZDUrly3nRW2H+hEbSVlD9UC6nzfgJbjh0AMS3qSgZrbf/asya3QqjM30r1gF+yn7yceyY2rEdVZnNc0x2siie4rXCa6CbBuf/OA560g0O24H51dSsrxVcgIzwvFMXWZlTuHzU9tKjGqO9sLITGy2Ap1FiLRJ+58PXtBYSixB/ADrEJFQLzbOFjALRqo6CtVzo+FUVEh744+dNPpsVLQ2dERKbrdSUxfedCyanpuW1js=', + version: '0.3', + previousVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130', + previousVersionKey: 'PD0gxj542sNjh49y13zXStCGpXNRRLeJpGJIal1KoFm7HlR/BbXNo8mJPFvGT7Ye2u/FQG2L7OH5RFD8QSZrDkyG2kthr1vTosT3TkDerCLeyQ==', + creationDate: 'Fri Jul 10 23:26:41 CEST 2009', + updateDate: 'Fri Jul 10 23:26:41 CEST 2009', + accessDate: 'Wed Sep 30 17:58:49 CEST 2009' + } + } + };}(), + '5ea084cfa5ce8198528f466e160862b4f17d0a4f63d3af45518c96413d16fe69': function () { return { + data: '47feWxZIAZlVAXvXRvAZkVgOzfklaI/tJVT/5/TXfM38kA3UIkm2L4kpfybLlJolAL+ia+3NbeDI2qqftV8nMU9VSQONuu0UGybzCYNBRm7jK+GrI4dLQs4j/slm9oDPSlNxH4DuM5Td8pae6UUdZN9nPFF3eOQTm8sqv05plhw7bElInA==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:27 CEST 2009', + currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + versions: { + '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': { + header: '####', + data: 'TJGyQDdjUyqLTS3hlbfYNbwaQ1/LvuAtNwE/8ccsxWKK07eHHshnFBN2j3D01X9nGgWKHnC3C5UZ/RIbJmmqx+Dp4xYSF0Qbrxp4WMtx6BUib0zwXOiopeZ+XaVyvcaz3OASav+Ayp1VEVoXiM70caQ125Ljmp17EYCWUrgk4gSKIy92d33Ia9GBT03x+uuVZ69y4sctTK6UsEEtrKpU3s6XzvQO/xZKtR5c1RglgRjjy+9DlFgt0+naBlpYkofS50lYsn5TjuAw+2+sc6wA3e7euzWOCHBmQjvnP3gx9nxgv34mxyuyj6ej4gSKyayee7tAKM98//2+MVJlQszfD0DAr+EdwT7EtJsjEz7jTAXmGAWSEh7yWkcWcaq2nuJhHDzocidXTuXX273ki7WxTXE2X0pZB97133iY1GKGwY1Wm+xjN+1Kkxt/UElkp9mk997BdT6ZTb8G5iLawtp4XWkRcNExFP2x66YHEhl2vzkxvwXIre/mBILJzfj29iXks59rmhxglo49J48roMZ8vMV2mMqGUFQjbchT59btyBHJSFiNpO7eqTExGdgUlE9/UIEBXSPLw1He5uANApPnuf4dPOPDJb0loYTCI+n7iMYdVJto/0s/wE1FsHQC5QfHMBlXncyIoq9PH9+aje28HRQFJlCtqs3cNr4sVbcg8h6UKi+5Wn9PD6xyYmOKeMdLKhrC65ugYMTAK/OaJnnEioWFklO1OOzSeY+4naKq8v4J89Catw7/t91+jmZeakudvQ37PXpFkbgyetL4m7rbBPb24noT6tyKcxX2xlPZwDavsRVdWKJsBXBewqsTpshIjuAE5qUPHNBfqAPzhNc1jvPjgTMYyiAo5ibVJe4C9N0N1AbR1Zqsy+ifwbSTB/9SHVSWEPjDmV+XdolPCWSifSGDhUdq7kk+nJ4Nt4dD+OcfGZlSPNH/976KttkrvezGrz0il5ssd6f+DVJU7QAwWsNax/lODSaRytwzg+5RxfO0K/tP3VQpi84RYwiJZ3T/hZqD6+9fcLJ2w3avPFyzJsGtwE5FrFOXbBHh0jHs59cBkuAfD0DNYbKB6e3M4byde8kM3MH7rEop2fDAdPclP/yClV51PMoNcMtduTc+xv7Ywf+tvBbfXs4k+UAc5sE++Ed3d1fooDwSSIB5xmHQZhlbcwmOlObnrOk=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:59:27 CEST 2009' + } + } + };}(), + '63e20b19028b7dd1465cdeeed60ca75b5f5508cd01601937ae8b0d1f981057fc': function () { return { + data: 'lhtfrtBUKfNoG3TCgqmbvvdfpFUUGIk3NvD197Rqb0kxJWllLFbCvOJxQfplhuIhIEciS8fIdFDPnhXJxCT6QwMf3VxKc5HM7EpN0Pm3Kmui2lKPsBpduSu1GVy5N8Q3/FE41IZ8Jz+Ht0+z9wZxjSg4ptBAlh1HHiJEsDTN5gixN0J2/g==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 23:06:22 CEST 2009', + currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3', + versions: { + '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': { + header: '####', + data: 'e5Tfxy8NhcOTKqnnyhaONWkAYgCwgEh7DMlhOpZHwIFIKp+NUAvD52nNwkpJk1jKyoU5M69MsIGpN/HWFa+Gz/pybmR1iTLUxLE5AtB+Cu6LgiPunH4OrLIl9wbWKiQEs8XGG1Qr3Q/JamLPHitPJi7R4vs9mzoaAGoM2+Q8FSEw99vEwLb1QwhjvtkaYMsOemRCRTLWkZvLgzp94D0QVMqZfpDBhoK/j9lFYVT00EuUEQI3eP0=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 23:06:22 CEST 2009' + } + } + };}(), + '7cda06249cfb102884a133952770b85d5442f8049db132d66f761deb765156bf': function () { return { + data: 'Q79Uv28nlmk8O5i46/0qkpbJangQTW+U8zhkme5OsgEYpFyc0dtb3YR4CooaH2f55QVSVdny4kzcBm0/JQyrmcItgEIXpbaFeZ7U/ZIZUYAZMvK10JPw0b1EVDfOuychdeOEf4GHbV9sU599v/yiobKTo5FkJYnX7bVOtYuvM0ASBf690GkszmGzHRsdD28QYNUaWLbdufy1X1ovckyDupPGmSz/Sl7SJrJLU/K4+QqKDpg3G9DJbNR+UnAIDWrl1Bt7KJzeHHdCiQ2hw290iHkncnc9h4HsxSEYXavHaSfbKviyV9arPQxRP5B4fPAqO66XwHGoCMzA/SDNfkutXxSInY2iUMfHm7B3k/6zjH79mYvwIP71YY3vGoCrZRTKE4FoKzpDhxNLUn2XYUXFNDKzwSycGSeROWnyE2njcLbMnHhqd/aneNIsDSPCAr2b4GdNdpUPyUp5idfnJ+WyX/F5v/ijrt2XHaK5Jhla7kfGyO1GcWf0e+b+3g5CUXhUgyZ7zz0v2TPG1wCtqwhj44/Q4LORD4zeatSED8nLJkjj+0x7sD6aXvDSKZIphe1/kgpWzeDlUrPJZoM6MxNjvj5OWLdwEDP/h67T7FAeHsVJyEx93GNTsWLjsNAnQEOoTs9r+ru1m17EvtGl+oWq3+qRqpg97HG5+QK0jnz77evslTpotnoSKULq7yXZBycmzmzc6TFuTVrD8FYq2E7hzZ5fQO+D1J+7MB+abPuoR3uKZDdJo+7o1nIvT0fOj5fOhZeDqLokvkhERwdivLR3EKjqnvzHT/bym6psXEA/5ktJASfowR/vyOAhVdXtzMyqakdcFiIQVYmcpE2KUpHybZtCa/52wHU0LyE9xjxIZ0M/XQzbASoVfpqbrQCW/fLI7rKLL/TdlofkxeWDHbt3dPPPNw4opjg+56pPY9hHOk2apE7bWGxcqrg/g+CwCy/7wdhahIHIjyS4rI2kqQ9IFTZse5qrVMeKHpfEQydm7tg5fX18Geh9coGpzGqoKF5VOyEk0DNk1fLvb1p1rItxw46qfK1unjAIB6ftIRHDgvDG2h5uuHnviQjHVg89Yp/+C/cCFSCfIBl78k4QzbHiPtz0x++1HujcMLqYP1+yLtOP5orV8yu8lBspaK0XVJRbob7JvR6wkg2Z4JIW0cGEyUKCOA==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Aug 09 23:42:55 CEST 2009', + currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b', + versions: { + '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': { + header: '####', + data: '84khhUlnVlkWRw4txUcWD5WAGoOmHVY+HxNSlssYiGWOJErHmz3ASdkRCWq4epGjOOxC1sEUezDOOTyDSkCFs3HApOl5k80WLXSCXcjcXPoCiQSX6czufZUfR/OGCmYgeThAbKjnN//GauOEOCdB0AvXYMv1tnK9xTXoDRmOS9PxN6eUPDQdxJ9mKsFBBRRu+LEhANE7jjhu7IqMRmMxt662uo/52rt85GGChYk6qprzbmf1dRViZ4mIccXD6RpYjHsqxS02V9pC5l8u4i08DWRTbghu8fm3FRTgvr/xOZTRFZrGL57Vxps2/D4klKQ8io63uAjxSC//yeU7LHCXm84f9Uh99q+wYNwVcCQ6Fyrz91K9aa8hwHgXq5WJZa50vduwKpeLNZchEbGqLCS9eVT6', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Aug 09 23:42:55 CEST 2009' + } + } + };}(), + '91dee4945d6660e7c0db77b72fd2eed3372a46545da1c1e5600a80efd554977d': function () { return { + data: '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', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sat Sep 26 22:06:53 CEST 2009', + accessDate: 'Wed Sep 30 17:59:38 CEST 2009', + currentVersion: '4b78e26a7c5ba770c11ca1f799f47112100c20565802ecdb8b0d736c1fee31af', + versions: { + '44aea76475425dbda56abc538b83cd270d00d8fdee6ac0575019bfcf4c719a5c': { + header: '####', + data: '9ZWZoxsnhlLjlSulSykBQr+WpToHUzdQ5Q3tcB/l9SePIhgQuHFP4PkA6dZGtLKazPj7EkJ0Slu3Y9TclBjggZVaA0hPpbxPm20hjS2RgFCboIWWOp8ib+xjy796TKGVGMz1RG5di8YUuSH2cc+YoWy9KI8+jJjiT28qT84fdazGag6ZamzQErDsPzMdCvxwF7W1Hd3QEA7AEU3dxvKC1LFuW4tsISrtoza/yBl3g+Vr4Ojcix3c3RnEZrhCQXxX6i9k2ASSlZytDg5dj4KAV4ZM6LZAt7hQS5Ff6IkF+5opTyM3Ahfg/t1FcAAyST74SOVI/+a/CcbQ7uGIFDYCfFWxkYwpo6fw/ezWKcqs88naHp2YVvsyfDI5OWoLCa3Kfhz1hvihX9tMFNoFi/9G', + version: '0.3', + previousVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf', + previousVersionKey: 'nR7icOODtT2RF4o9EMxZTH4+qZAigTLp62lvjx+t9KZvpz0+JbFnmkbsp/X3tqswLKeOyQ2wCkBIKIuvc5ot6IJNx2QTVf+Nyibw4JGWiU8qoQ==', + creationDate: 'Fri Sep 25 12:16:12 CEST 2009', + updateDate: 'Fri Sep 25 12:16:12 CEST 2009', + accessDate: 'Fri Sep 25 12:17:17 CEST 2009' + }, + '4b78e26a7c5ba770c11ca1f799f47112100c20565802ecdb8b0d736c1fee31af': { + header: '####', + data: 'i2axYBOEjs54cYL/YuYRbYVWTi9AVokVcgYboJ4A8il9yQOqev59Veb9+/B4yI5IjRHsz1wISAKmcLvMaE3ON79P6hLvGmf61aDEeyRzWnfcGTBJ3Tf5o2SBsOeVjPIHYAQF3gcSHk/vyFAKq9FUMcytgqMs36V6euMMYT3p2n3diF/wMti0nnNaA3dEGHDCZO8KAm/VWMySWH1zMkjkQ7R/Fu8KMKMnsNBJcjX0wFarVZWbuo9xJODg6vEsz5+WakY8UN6YhG//JsyFJA1F/0eynpWhAtKalhyh0JlCBo2y57iDIIT3acCxg05UMog/GpyxMiak3/iz7LEzMcVqkU7M8PGpUpHE4JM8fyl0IvOgHULKS4jcoPCQKmRAUuFbbouKwCE6sEnv2TjD9FxM', + version: '0.3', + previousVersion: '57b997d24ed1a438f7174e0c821b0c7197b5d3e1d0240f0956543934687a9763', + previousVersionKey: '8zvslkM62Woa4lFVxpxDCHteoFi8nAK0eC+/C70zuOkqmyKe/2Mu8YN1/hhd7TvJBW5JjzFElYm5cNv7KITHSmCe9ocwa23Bz/Txl/Yk84KC3Q==', + creationDate: 'Sat Sep 26 22:06:53 CEST 2009', + updateDate: 'Sat Sep 26 22:06:53 CEST 2009', + accessDate: 'Wed Sep 30 17:59:38 CEST 2009' + }, + '57b997d24ed1a438f7174e0c821b0c7197b5d3e1d0240f0956543934687a9763': { + header: '####', + data: 'dDjbpH7b47K/OR3x8DFAr8317ojvn2XU9UeW9XCXNDI8ilFYvhDh2YdKiaHnoFe9c5nwqHH78g+V/U8xmbv9ojvuAw8EAqhOlen2W3QSi4oh3eAWXGJMc7QHMDhP38l2a6NG/fLCYE20aKof0thHYAZtCA9xh3Xj8P0URjPvzPEuPxSgxxtku6wrpuUJVmE9L8iM6GMxdtBg9ohnhknnwUQl4eWYEIWmANTkVOG+85DscW8AWzSCnGlBxSn2B0nYiYcVIbv3pIh3UwUK/VOnCg3J3zqFx5pL4T2pMBFhXMSH4Wg9KglSLPb2N1aR3+1l2W1mRWy2TmqBRmis6SKz8VhXlU73wPiL1xpdSXVXGdNTIkDLkP9MYugdF7vu/u2+DgPmbFZXNcEWaZP0UwWS', + version: '0.3', + previousVersion: '44aea76475425dbda56abc538b83cd270d00d8fdee6ac0575019bfcf4c719a5c', + previousVersionKey: 'Dq/81arpQSERdDNvvERMt5uVHxOzjUBKZ3bxe/CRZI6zdf06G19iT5L5Z7I0ZKUoKEoJNRTiB5Lh7PjDNibtY4oYRmmKXpUEPbiJKp351W23NA==', + creationDate: 'Fri Sep 25 12:17:31 CEST 2009', + updateDate: 'Fri Sep 25 12:17:31 CEST 2009', + accessDate: 'Sat Sep 26 22:06:28 CEST 2009' + }, + 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': { + header: '####', + data: 'osJ+5cwMZ/4Gq8WSNeRGwEJ/On/jDfUapgeyDYyGzkIznGaBIs74iT7TCv/i/EfJjqJQWKT5CAMtGngGjyrSC2wlhTB29VrCagyhYVZe85FHHLqxShwXVXMlCTPqxnJ+tUWAme94Lq54W8U+/zsFBqRhxteWYcfsAT1eGxMZbHTGU74OLLYCemh4jcvV55PGg7u55MTwzUebPlJvrFOg2KIqsqUYWuRzY9TjEWTb582rihGBJmj6SrPYcBN7e5j19mKtestLFMOw05oEEFNTPWaN50GD/8IuwHc2wZyk+VNxV3NDRwwqnGiKIkQTs/ddmKe4Ny6efvBXH8a4eDvDxlDCa5UHbYAT77RTg9jFS/pNeoHp7ZATy26/P5C0WqI3YfKfvuf8H1yRMzhDTtU9', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Fri Sep 25 12:15:47 CEST 2009' + } + } + };}(), + '983f262760a45171a8dbaad13a7c87b8a3dd267d1cdba7850b07e58af0460378': function () { return { + data: 'NUhdggGXc0aw9EgLWE1zCX4yTNZo5rxAvXy1e/i4IFQfromU3ARkbjBkVOui/VLrCmiExe81XqujgJHOqVp9HrgGuNxeo8ODqbD2p+/1YfxCzconrCggYf2eSvsIXuBuYJc5bGVdG/Mcp0DPedM5Gw8MvU4ix3EwVvIaoUdRi3RJYlsO7W0fPQjcWTt3rhLI0lkGTFvEbaK3b5Q0xv5mBup3w+SISIqDAvbmzNhc2DO9BzbcW158sv/+hBe9IHEtj5MoX/gY6pBdg9Dlnblql0jn/Mrfd6SR+1FAv5mS+NLqt6NHejs+8n1xnx3fOv1Tp2JoR+WbHBhL9wOlbMUjbzhM6XXB292Mb+KsqAzDdtNe/3sc1krIaSxYS6GwhPhesZOY3L84iUhAay60qdB1AQa1PDGPM+lkFEI3uqUZu32uWqnuudFAOTsgKcWVSTktk8AMD43zGbBhYKu+9cW2Ye8U1lL7E3+iI8fm8HnRiuWxGB8zKoqUZQ+FDnwiSFSsBYlCa7iLH7F1Cz1AjhCec8QsdlIA3TvbiKzzLCTmGZhezEJP8JiGifV8CDmWnrsRxgBcGj2CXAzksn0tuMGyBA1WwzK2DVtKI9utb9TV8CASn2uyzrr+OB5D7KPD0fuRDHSK2SEVPFkP7xXyLEZkFWy9W3I5bYyt7j9eUhHX+uk3WdT1onYAzogr3AhVIcMQSAeoyrxds81WaIyy3hEs8h+QzWVKhc021Xw7S1z1j5v413RLBSolwYaXrR0WjcA9VDnn+vOxsurR4y+Eca9T0+Fjt5Apzs5+nSarvi5rQbr6ggJVQ66qRv3SPIs/c5niiIVEK83xrY1fsEnjcJf836P10Ho35URQzqMlggICI/uBc7zgzPdkMBIvySqrCk1gzZi9PcHZoyNZO0i49mpGWnqDk2V24R27T9FwGkvRunOGw4nFS59NE3ixYz5SWZgIAayPBNJ5V2sSM3hUJAqXUl2vDlyXlqhhW9n5j+7nXhlwgibQ0Rk65QchlAXbmwm6QrSOX617DYhcBH12aUQMB8cQgURWmyysHV3pqvuLANvhjV1u9wkxfzuOdDJJCE4in8W2VUCTcdDtWg2L+RDAjvNGHFeLNmYD94JWdbtYRAGnH6oQWE8G+z1fgdnY6u8GNx8WsIH1thxHcle9UA==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sat Aug 08 16:29:34 CEST 2009', + currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', + versions: { + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'K1a+K0TdDtLXo6e4ayBuwGN6XSjub5Xgy5ogA6HWVqe7tiSoi4Lo7qMloK4TF29YPB2KpHOyxodkXL0YpqztESCrBK+F1Np/t/uThl7iXEFNSXSIz4l/Eo54UX/PZEmKZ+4nMiuYFgMq1rV3VLQmciexJkic9rABwnGMreJfKyDt2fEDxdVUwZXnA/l1PPPGFVSJmkNRjW/WLRByOMwJxHDK1ElbIFHdkFRzg916aPTTjcV+KpUkSligoNlxi9CgmfeBweLuDRJL75Osw3ha9WjQXrjTlr7o4sSVud3gbivYmJGgbOTzgge3K0A6ztS9+8dvvQleR9NETiWDDhJ1+3Y00jXc9jgOEyAQklD1dQ2dew23fvIVXSofVpr5lp88X6gc0OnD90BbxrTxjL0QYIMlklgTq40vNck=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sat Aug 08 16:29:34 CEST 2009' + } + } + };}(), + 'a0d5d8796793035d1b109654c68d34b94e2aa64b5f76d50f01d9a18ab1cdfd5a': function () { return { + data: 'dIOpF0FJxZCaFDj1XeU1L9/CcnHDffBgeOxN30sAH+++Dv0+skIYibSLkbc5SFOFKkZtKGeXFq1fZW1Uynj3ogRJ3Qqb8+4eyBiwViLXTFefYv/g0LcHqUYBrRwYpsATZg5VcZpIvXzwIT0N5dtQoh8IskMovV8QgBICHDAJImB64c8bDjVpSn9GWMSiSqsSOu+j1IG/C2/Qxxt5smKD6iINfJS8Y36iovV9vRocW1crj6mHatJxut/EhWbKrXA7U148q2/08EZPfAS3q+Onv0VUaKxgB2+nhsUSYjP3tvVlc4LS17Q9CnbA+eNYz/DfsaMtnYKTcSh/91ViA8Kv1AGzEbWIMo6On8shuf691bzKBdRG9Fcpm5Hhb+DziJ0Go7W99yu4n6exHAxJerXpcA9t5fpsTH4T3lGhbWI5HRWoU0jDqwdE2J5jyZaUVf78CjfgESRdJuOKIuV4QX7xxwRJP9vcDHgyhr1LcscVi96XQHnii/tl+BAUYdwgvv2vtTmuoR0ydtweQbDjgLXtk/zmyYmP4dTIYbU/Qec1m4E96jZdTalWU9K8AtnopuqfLdTlFG5mGtHrRpRpmu2o7b7P0v5V/WpUpPWzk75sv2AsFD7oiTHuZ5GKUfDs8pbp3LcMNk3nSour1NyiDWFB022hwbEk66aQaNxJfCKOWwWimc4TfxhVG0imjtdlp3MdcWcAY+tJMWklDm/q5QkuHy+JxfNzHFRI63+c5+/KSFHVUfZNoIRNdDIlnTiX8zKojU2X0QRzxEc/LYkIpon5OGRnJy9Rb/HotYbovBC8yS6610ttGohDp9v+zVO1uST2COV8j8p5iBJT+YVgQvLGXg/Y6ZQw1X8nGeQClBZnPZVhHcnTtQV3tyBdsc/ZkttJ5tLW+FF9hAt48IBnI1um28Fhh4y55rznF2W4U1PyJvsmVk9eMK6ccHCXFNvzCN6XUDY862pm4atKSbIMQVuT9nOC4G2cSl2/Pte2W/s9A0RqeU3kpZg6inXYNknhTAufQc8MBHuNPkMJGTOjOA/MUKHM73+b5Iaz3pBXKiw0qlgkfsGoRZ4LVI3oU10geEqNoYeeseDU1o/UDDC1wobRxy6mrob/EstC3zoIMvM651k2h0Pj5KbjE0+I4d2mmObIN3R/OF+hdeVAtZYwuv9aa18nTlYCx7Wo7mGwzPhFVThaZT1jgNfHVFa7lxvcdi3zo5ihhPUXjC11RrcKcdINMxdvQpa/xfwV5VNagXN0D7aXaxVQj+HTlttXx2v7ElkhpLpTA632ggWBdL+HZNdWMPjE9pZO3KhU0Zg7x77wfrj3tN2QC3uDUSOJOCp4qM4=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:43:56 CEST 2009', + currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', + versions: { + 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { + header: '####', + data: 'vWUk4EzThQjfNp/Ji11ZI/fO3n2sp8iUr2Fahuz7Cl7uOCNnXXFoHlbbvZNgZsrVVmK3+YV5WxblVxQYlH2IRwdXsvkfzV7S8aqJ4V11tgst31kZ03vQ+pfPV+26Nhv32sLWLK6t/h+Ap701KpPsng6rrWd9YgSRzN0gQt80aHZtxVknZcpAUmh1thx/VaehNWEwLPFOvcGr6H0Ku7U6v/GNFyBmkgPYMh2Bo0VIhns0s20mgA9L6TxwLcMYikU19WqxX9GO1n11ii3WAWA10gfFjAwYagnQiwpl5REU73I5raYI9XU0XjouhRtkMMBtCJjeIDb3GCQQQZwTcVFXeokjtAlP4JHdMy5Hrl0LvjpDI77OU/rDHKPc5TqZngvFk06TjoQ7pg2cm7c8y34=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:43:56 CEST 2009' + } + } + };}(), + 'b81f9a1d9267daf4afb786e8d477c15aa3e1babc59b8ba09bceddc700116ab0e': function () { return { + data: 'bJdzIqpYsh6++iVT/jTS6bj5SgXkW5alx19H2laFERykhmkA0hxjOTaz2Sizlcsg+NKEQIASIjrVrLxcoIVnCFeJjDv4FOEACpMxNEzAiWTppWx4h6hepKT+h8gtkF4k6QvvVXHBXxRahQT2tqsbJWmOgmxdIBEeNETZb0u7gD7TjI8ATetaQ+TnhKlNbObUd/LsuJsZuWwpeZllEtNTrwNOrlHQJAUe3u+xI9O0lVBvH+/KHX4L7QyY98O/aI5wosDWPUZyv811PKOCMCsL/+2qBrH/D00YA+gCPy24riBrrK6RJWC0BdpSAUhPZA3OJSm1miqHNC7/JCUfH/alVMaoTzrI+A76LouteQmwZrXE/taTPY8zLD+TCgMOGhgxErVcw6278PQSfuERIJuXlCiXX1z011JrRE1k6JX6Ual8gwENvYlbXE2/iv/xzXK3WtI5vD+x0kRqa9LAClyhSqY4o5QXlEBJ663j9PxH/+vC25tluAtupL0nnm4sEtFmVMiZ3S3cRRZ6ZzquPD6rQjzdPpAJe0S8anC4Pf7F86Z+Ag3lbsrmV9Y5uDhx1T9pyWaydL6NzyJBw1gjgobSOw1wNMAzn+kGLqH9dP2c+Jv9zp60vR5Ljdf73jPxWcVTQxHZzXuWfb0MpYTwRDmpjqEsIKkyaYu1e7YHYaD9RNro7Aek00n4DOkPJ+lQHdeGLioNYraYwhQq7Y0HAKFsUYxv3o8vI6X8YXk6GgbhLXjBIyly9oyVMbGMShCuDE2dt+skM5Y1Wd1AcENJ+YzQrRwc0QWrYoABy/MlZbhgh4LpuQG6WajXw2kgS1Rme1tMviR+qqtnthsdWClKp0y7GZEA5ycBKABBX4RDrwIudiitswMkvBCrSLAxT3KYGxjlPwhGShf+zGiJ2vS6mMh2KS5rrcKaFtYsOSfBoNDpPaK9w9QS2W1EtwuUY4zZbUO6V1K/URx5PkZrSAcIRLw2CjLad9CbyhOZ7H1mW6ovHYXHwDPAVU4wYEqO0213w50QyBOM', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Jul 19 01:09:10 CEST 2009', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'fUzxKwUtvtyjL1kIN6jfxjZq9CWEH9nlvSbND8x9sn7cAhmyuvmYR99cl3e8GJ23uzxHn9uKn5hTG0uUHXBMrqIpCw/QHzu4FDXWS9RrR3iGJba4DIBJPY20VpFJzWr9xbtnC8R/TDt0FXryE/V2ibiiF7dXNucbhlO+dPmyDXQpNDQf9QRRpPILCyfd01DSUVlvr+91DWgtGk19ZTAGB3Cl9WuUtRHUnBH9JhKLEohzou5p/1KcfEFwMZ2SOyiZPwwBP1NqE5fqHXqzPNzvvQL6bDxH8czkAfMlw3URJfhnlSuSKa/o15bdwMLyFaNrTjod3Erw7uvPxpyFg8Sw2yCOM4xJ1Bn88vttklNQF1ut5SkAwDYi0wUbbyP6CnE0ItVvc3MKZx+0r5RHzasJpQY=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Sun Jul 19 01:09:10 CEST 2009' + } + } + };}(), + 'd8568a483a8f443190ba723b391960554962760cd886b2484f2698816beec530': function () { return { + data: 'PKAlMlebOZaZDdwgP/Y5cZBzXYLpBdppooxzQn7kzWNg3ut1o+M+bpfjadwdM07MTtU9PpdanlG4GfDPf1uPn/XYN4msUo2V68J/tliU7M0q2t2PKqA2YUDl3UIxMlffhvyYBpwsdary+4t41pKkPjFt3/WSthLyn+E44BbjAKRbpp5w1y//GscTXDlQzdDGoSNdSjpu8hx8Zs4tqf/9UnlwH5kh6Wzq7+Uf+eqiC7S4fPfZ7G0OZ7+N2oKHiV7EBRSX4s7vcrs5t1S+v9HUhk6SkZ7mMZBjSg1x8sB3ZZB2sLAx+QCJPyKv9+/uZLrSMe8uFHBI2H0dx73mWXE/dHK8IjG9mZs2riA+KYutHT4jV6ja5JZeLWWuZhKzooJoSk4A7cbd2zxvkyaqLkscgVBWYWf212EvGZN0ardI1fW1+RTE8QchyX6ty1AyjbU2T15HKwLvdlL0v5aPscZPQJwptOMCrjYOwkbMTvxe8YRKZb1Z1VzyCn0m7ODxz0iXV2H6pj2hierKuqeOuK3HWV4rk584ctE2KBIHh7WJnkqRYKCCQ1s90T8SNkqQiEow4Bz509seQ8ZRROy9F8GSCOeIQS9DVbQkRjgEOMo8DFSTNT1HzBiGhcaQkweh7+V7oAx21v7F+UYEIIvHlSvKXTEA6rK+eHunF1EHRvoGGTD61btaaqpfn/Z53DKd0AMGK4Uh3eSGkqKM5IW0mgebs52//xQI/BUrEimvSu5u2UYLh6V9sa/kT9yNv2BfnRckGuNvaNvQBrw5LFOfK59UXeO9h6DcWs4AErrj9afu29xHFI/h+HdaixEzsmrboBqEn0g3EghL+de7N8z4CGGQ/CzhIKmAlR5f/u0YC0xebVNLSKUzTi1m3nOhreywKCO4C0kzwbduEX/bJ34SXuYOpkjS4W+Y1mdd6tnsAPsY1Ku22pjPQz8/aKRlDvIUKi7R+6Sk6Q1pIpcwh3hvEkN1OSBea1BUho4udaulPolefLv/kqNwQZeReztukD7sfgpZr3GEocBwnui+cCLj6WpVu2qlZpxGvnitmfJbaEEw2HM3RgzibGtsybeXwWK3orcEnPqquApWtnTXP8rhP9TBW8svHA1NjCgSrvDbjmSUPsRAHkV/zlXhH+JJZMv7tg4BYNuukJuiBFn/EewEIA==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:35:14 CEST 2009', + currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3', + versions: { + '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': { + header: '####', + data: 'wuvj0q69S3FdDA0x+DniTe4no4vW6EF/xMiRD5GoDdNYxx6Npyxf6h/FiIjujncc7GK5W+p09Bqh4mHdsyBAwe/Y9c5mshB9VpPgsF9YctR6iLnOs7TGOWUJ/ScgskhagSGZme+huFkFjEe57yx2FiiswUW2XVI1SPtzHNx+sAGoL+XcB8B568zTyU50IpJfXlXR+10OTRMekaTUyNmNF+hT4FnRXQKY4XL6NKSvSH/7gafKf960kQhJ1HWI62OFYER04ANTFLiOdhfZE7YcEIG9W3G4UFPRI7NyZRewah+ETOLSrTdbhItY0kb+FrMrhNSrHLBjg2t3xmuaptDV7BoPYtTfOaD5zgwPgUCj7KnnbamgQiABGjKJnl9GMC3bej4KpKqlgMrHqUqu9AGVCtUc', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Thu Aug 13 22:35:14 CEST 2009' + } + } + };}(), + 'f8141d3cd5cf93f3ade420838f98e4bd0e5206d202b45a24822afc9099827c17': function () { return { + data: '6xoQmnyFcq066ExiktwoyXTDnu5+d7+7PwMtvUVX8AjU/1jJJpG0tN4FnVWaKIngm4cdyh9Em3F9iZ2wDJgQ4+IlqVAal5pFgA3gvsw8awqsOkQoibFcmlatSO4H3vExZ9P4vHFherBMIqo9u3zwqUClgAFEyw0UlVIJ6VIsE1qSQFksBlnxV3sKu9kjigYVWd/KodpNqiOiX3CEgQGmX8bHTh77VWXNFkYGRaGhZvXN7gx9qLSZwSLn2fzgxzBbjOlX9Wj5tQQ5pxev5pJd19pPAmbzJZcdZVFtaiWh5A8wwROX44P4X6qfcNWZt/rx8DRdtLGKlJy0GWTQMZXVeKqmE15I02EYeOPPbPvE81psZfCu+zToehQa86l270wbLKu8Cv+8Bfx8XJBLsYLL9asv6XzAoLMG2lWX/TkAPavJb8Doqpi+SEeK1YmYg7YE1hyIEjDrsHoUY1hVxruYfygahBDEoa4pyjQovhq5d0e1Arnzfo+LD0jcFuxFj6zcLjoTx8ugs0X4A0PeP5BG7VYuGYx/mBIWsu+0ksjGlkmC4EIHJpHbSeMUqfTxoMALmdg1Y8oGnHfCKhlr7ztjOBo+nE95iMQI+L8Hwnjto0hcotY/ualKzwDXf/BvlxlNov+Z9DWvMe6q+8yqyiVZE9HD7O7goienh51Pa+wV6K5jdnzCUTrK5ygk6rfbA6tLdjc1kAzCU9oJguLSwtM4z7WMel2V48kOMD7FaWZHPCatweKPaanV2WCeYhtc9X6OvIJWvv5O9j7fNd7xFByZNORQYaHFN+5xONOVJ6T28TtDn/VdVc8u71kfAYWLEG0Au+b1GY9doAxHwNN5hcP1uGHEsc5uR93qgiQLa+zZbUc8to1OylcLZY+yWdyiyUEXM01nZH6ZYuDdRUSiS6WkM8KPYLwy3NpX1Q3ZEC3uM1yi8589scPl4JhCd2XBdn5+iu231Uzu4O/fLTmN/8kNNV00x9Xa1Rj+0+Srht2WDgJVcTBoODikoh4733txmOl03KFCQd/HrRIS1DE1hrGAQNexh0Om7/WO+rzaSPmzFdyskqF1bXek0f3V1YROWxKIfHF8jz/wvqVgsGEtxgtCmXqyT3dRZlKUxNXn/ajgbulsensAQxUEpeB3OeVxNPl0SExb96oLSvMrLJO02E7hZLkB116ATnqN/GVtzHJzQLT0c1HPu9UuGQPv3D7qWpx1qMABuhaHbpyY3OcN6DOZTHuOzdVETIkYlPoja0TMyt6iHrlOM3dFtVDUos+TJyVSWjBSHVV3b7tbpGFulSan5J2BWbCNcSCMSfJFOX/U/JlovKAodr0Li85K6nej2XI4N8rVtV9ru4Ktq57/z6REvoBaIS2YXUOm9s2YhOA54CByVWvKXj0Pez6U7YVJvsviYtdp0IxJE6OrebzpVx1skZUFPTbcmuD5/GwOv6PmgciOJMY/nMQ3K+7F3A9AZgPFihLLPOh2NpNhoj5Zy6IlK3ObptD6I41HHlN3BsADzV2buAbcTDyYYZJ9VkBI2ZkkFhrcB1WM+qrkODiPxumXYGnGSHvbuZq0m5k8Kw+WUblmedHyMCLNEiwH2YQsaRd8s050wE4BcKnNU6wPn8HExn5b7CFjMJReiST08BMcszUTT677QQOcsbGvNPq1iYIrv0f2rrNHKhg2Kq42+jvHYxndfuxnTUjecCGtiGpuLdh/iehozSjuZfV7fZWhJsYOz/HAj639sJy+BMg7+gQv/yrujd1c0n8FixDryiogKLfxnnfWIUW90rRqcjRW5tn4mUfhf3eEP83PmKvafvRCyauY9Ho=', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:57:12 CEST 2009', + currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74', + versions: { + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'IQcdAD6W2pehgomwdoNVtFe+Aq4PAiHM8lngNDSesbTPs7dzFL8DR9iR0VdPUfnpL2ddaWB1dkOI83hQ/vFZUeAHswU/6Gmg7KQPpciVsbNMAHkxidDQMncMvU79oi0QRUvgWCrVbpuNd0J9Ir1vZVU2UT8LNXi4RibORSLhFo1GIyy6Kss6GOvDDWnUzBV6VYqzcv/nrLDlL908CnbmQhCaoGd5j/TjC9Hx1UaJ/xfqOwPP0jgw5b8+ArB8tICkpLbEEXSzKG64hGyY5DToAo5FS7QvZBXhzhm1qc0VM0RCUcvU2+sCm5yvT/qV3LRPDHKcoqle2PzlumsxyuiAlI5y9UaT+6GBbTrJ+FeU1zm8fVAyg3Q+FZWN8A/YBj1qb38z8E1D+38f0hGv21QfYg==', + version: '0.3', + creationDate: 'Sun Jun 07 11:22:08 CEST 2009', + updateDate: 'Sun Jun 07 11:22:08 CEST 2009', + accessDate: 'Wed Sep 30 17:57:12 CEST 2009' + } + } + };}() + } + };}() + } + };}(), + + 'test_test_with_otps': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': { + s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460', + v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"3f5cad41321c89a0570c310f8e994a13c39c83842660c540960586fa9f2d2fc0":"0"},"data":"cllv5EtmluxBR3AWjet3jfZsJZDUXFddl1hIO4285PJOUymk5VP8nxLGSkYxkrbwIKHxxSERdwhcSVeuz+QJLFzx4hP/wngSNJT3edxh9pwM+fUs8nJunyK1LNS1JatoaWOIobTV1DbotfvxGUQI5QIxvKA="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"1FTEyUjZ/MS1Kp91l3j00WNnOel6EFQhAYyAhcr90ozYwu6UDqlKNKyp5f2ndVZS36ReoxXbzIUYUJoaQegdvic/aVfyU/drjqVA/Ta2S5ICR050ewTUBs5BebBQT2WAMzKhmhQoKvMNCJFpNhLhJ7sbevyAHX4lZbpBUz92hTQ9jtpTi2pZ7IBUFI3JPV71H0reIs8FFA+Ugx3UPVVq77famGm5mh4I0rjY68zVvqNvfB5APM9OKR+AM3jkSHUa1QEzCEObMndR8WfKEyXlYoEhnhr1UEra8v5INHpSacU8210="},"version":"0.1"}', + statistics: 'tmRcqihMK0YvsnFoMKH5F/rN', + userDetailsVersion: '0.3', + records: { + '3f5cad41321c89a0570c310f8e994a13c39c83842660c540960586fa9f2d2fc0': { + data: 'nlihNmY5UjnGFxilT5LoDRvdp5WoHausCTiulBY9/Fm82ZJCEZ0mwH96WzsnQ6zMvrZPFHAr1zGAQPr82/MOr7xTVILjbEP6MKq9rOyEDRhY/3CVQgJVWLPfwiL9ihw9jKkd7ea3eU/RSj7V0UQB1zXzEXFqw0FwQcpSuCOl5hkYPecydA==', + version: '0.3', + creationDate: 'Thu Oct 01 16:21:50 PDT 2009', + updateDate: 'Tue Feb 09 08:57:03 PST 2010', + accessDate: 'Tue Feb 09 08:57:03 PST 2010', + currentVersion: 'ac353e86f69528d21dad0b17d00bbfb3e56c954e2ba71d0d091c903880ba1479', + versions: { + 'c84928db21b880a53e7ba1e51eebc4acc4b2bffe66f30368b8b7070973f5912a': { + header: '####', + data: '0xBSvvZ3EJhc/PmW+8PtpaLSAOmGo4i0sG9Uwe9RGbzDILvna447spjscE3IxIucj1EuBagtc2hvIT/tgkA5IIp4fq2dSvk3RF8h5+hXPy877tEZkiQFpigyUHd27smpYDSYc0Bzv0DWx+eR72TFIjwbU/CXxKR3qqyzma+q1pqIf1GiaZWlM+Qv4xmKEkJnRd6NdOyTwuAQoZ9q0O9pHtkDQ5eKQlwvuZuL+8Tdhn/Mvr5HzIset+4wo5HNvmkLNAtonChJpWWnj6Gc8LTI+ImSjM5PVku/O/pJKuCYtMovzzEoNuFWrtdn9XESKF3yjtpKzuDxsNPrfX5Mz0iBZCefbWEtmqeABn3o5IgkpW/rhSmsyu8UcCoq91O+Yb9+8qlcsJyjcLECd+wgkpN926vcg/LMTWUW6Oq8x1a6mM8Bw1u9kT0eZGgKvu0CZpv3bpgVAWbfGW3aTM/0moWjHa3amJaL0DPjF8Pe9ujUDlqVEiPHznzfS+aVB+M3DtjfNEMysab77imICRs39cm6N/XAz+CNnSuP+W4WPfbZZ+3xWU4BgS7YXd/AM5rlI9sXNQQgzVmQttNo', + version: '0.3', + creationDate: 'Thu Oct 01 16:21:50 PDT 2009', + updateDate: 'Thu Oct 01 16:21:50 PDT 2009', + accessDate: 'Tue Feb 09 08:56:46 PST 2010' + }, + 'ac353e86f69528d21dad0b17d00bbfb3e56c954e2ba71d0d091c903880ba1479': { + header: '####', + data: 'DGvb5Ur86eYxzJrqITEX5XqtGQT3QiaR66B2vw5F+6fo6cxWwCztnoEFyLUPzZGWqYMIIwA2rKaNBW0PxO1ehu7kyyQ/Tj42g64JiI4sVtb47W5/En2blTtkPe1FjpBiVW9ZaTDo4ia2wMzrBxTpUJ/NCT/Hn/xAyhZrafL+SN8U94F/FX6n5x98fV9KwrtjPpqeDEtfwheiEzws4qoPy1arXgnaECxOFnri7KpjwE8WVzwbU/WFOGPewKY4bLcba4pp1KjjObhVcYyj3K+GkSHeXyBDQqZi1grKvGOGvoZkFr7CDndseaXZ8og3A+NpqPcOzbqNst97gsky2RWc7bD2MfyAJ+QHzw5uDFCoKnAv5VH1HxwkShLb2QswQFf9/AGT3IDFi6ssvELk8xSMTgICV9jUwcTwkjkBa1Zpf4GTr6qrzen4YzNeK6XxgAqueKFbJoC8p0l1dBGBoH5zP0bkh3QENEFk67FT3aXUtInP7ZDX9Fnbe6qPkoztgmG7TukNUs2pk1Z/iJTVrUdLTVtwFI56LaTfRT8Ica+yFJc+1zoKeEg9LKcnbgfPY6WK58o1vXlhYb8j', + version: '0.3', + previousVersion: 'c84928db21b880a53e7ba1e51eebc4acc4b2bffe66f30368b8b7070973f5912a', + previousVersionKey: 'vy7sCLt6q3xaMngGjJxVLcYe60vW0LHXDVZGo7QWZCIOjK26Yn9JvpeAi4rKJ0/ggGGyYJncqHVr68u/VHuwJRUmlRb7JRk5k9gJOyuroyx5wg==', + creationDate: 'Tue Feb 09 08:57:03 PST 2010', + updateDate: 'Tue Feb 09 08:57:03 PST 2010', + accessDate: 'Tue Feb 09 08:57:03 PST 2010' + } + } + } + } + } + }, + 'onetimePasswords': { + // OTP: 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg', + '7074103e8ce35f813dbfb9c90665bd66ba3f5b1c9e4fa7a3d8aee679b7a38102': { // reference + 'reference': "c3664af5744319c6d3b874895f803df19cb0492acf27cb51912110d023ba9b38", + 'user': "9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8", + 'status': 'ACTIVE', // 1: 'ACTIVE', 2: 'REQUESTED', 3: 'USED', 4: 'DISABLED' + 'creation_date': "2010-02-09 17:57:14", + 'request_date': "4001-01-01 09:00:00", + 'usage_date': "4001-01-01 09:00:00", +// 'key': "7074103e8ce35f813dbfb9c90665bd66ba3f5b1c9e4fa7a3d8aee679b7a38102", + "key_checksum": "53739910c97d74c80c6028eb3293ffbc652def811d9aa11725fefa3139dfcf29", + "data": "aN3rPl5rusBWXveUpjKqZNFLRPWJgH2Zs8HYQIaS65QObQFWFTZ8lRpBXFoPlvSOHcHQpEavZUuq31Y/2Y9sI/scvmZjQ8UEaT2GY9NiWJVswGq1W3AX8zs32jOgf1L5iBVxK54mfig2vXFoL8lG0JGGY1zHZXlkCvFPWuvwuCcH+uRE0oP3it0FvNFBV4+TiiGnGYgD9LPAVevzr/Doq5UXjn9VplVU+upeDTWY+7rlOdIOnZG/A9P9/dQtsyMb5c5zABD2FNpQQ40JDfG/nHt5WvfuWmPwUisW1181oBAd5BwF9LgVHdrhcSh8OuUL7rdbKTPTlWT826I6JNrFMzYGMY+NV6gllDvc6eCNrgI98ABhL1AoZNpAXXuCy4uQhEYmj+O71C/eXEDw+crMAXiCn6SZrbTM8GT5TQ5yF2NcxhudopO4qoILjnwEHZZ+i37kRDFg6oCBccCD67oHTPexUkSqnKIIYLli5CdmE7UdvX6LuVG/VYJKevOUgMf0UzHDPgvtlp3gsSo09TfNPOtoeAiogL6cAHb1seZwv+6E8Pz7WqkkOTsBQYeHIfPE0OnQPDtUjVRA5MTTX5zt6rCCNDKNbqfkPu8V4am26ykaWOSTXZYIcfnywkG0TfPzdAyQvyxdUyl/r1b36bclQFiXcRzkz9zS9xx14Il3QjYXRbIFWcwm/mEFltBFPdATKo5Zh+wcTLiFh56YEUVa9/h6oN8281X6zxH4DOw=", + 'version': "0.3" + } + } + };}(), + + //------------------------------------------------------------------------- + + 'otp_user_test': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + // username: 'otp_user', passphrase: 'yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg' + '0faed660854b02a5eaa7140f58d9dfee875361b353609f638efdd013b95458c9': { + s: '61994a953b7c053abca196ecbdb76547c9936654a434972d3d1de84e927077e4', + v: '9250fc0a479f36b9aff3fc0c37e88169cfaecd25c2c6d59ea2f58271c2106265', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"a1bf4f4c924a10ff0e52bd9f9e7efce8b09e97a5b0389b1342b4a62226be4cc1":"0"},"data":"Yw3NlPSpFc3YQl9pMh2tvcVWHVwISUBoFGqlJBwxtuLb6vpyEg9AJs1LDjtLd+4Zh3rkBD8Hnxgc6R+DpNBrVAq/hENoMVtAtFm9FznEQO4YOe0jKGJei/jTRrG3vf4pWG92jUHd8JDZ482AzArp5leaQXC7Pg=="},"directLogins":{"index":{},"data":"a52Xx78tyoffHRu5J99fr3sH"},"preferences":{"data":"AFqk+zN3X8UzmWw7HI+p/BvL"},"oneTimePasswords":{"data":"9iwi/ScBH0o7SVZz5nLvu792"},"version":"0.1"}', + statistics: '68Nb/l04isS9JcTQf9bmwq5/', + userDetailsVersion: '0.3', + records: { + 'a1bf4f4c924a10ff0e52bd9f9e7efce8b09e97a5b0389b1342b4a62226be4cc1': { + data: 'hNdplOo1+O6pW7HQ6ReYx5CBDzWL3oopwf/7dMH0RVMYHu1LbMRZDRZTpjnLX33UoCkthF4Br3xkLwg5gDMuR3unx7Eyyf35yZj3rcLr+ckj/z3rV2rlBgVahwV5xh1E3nVXiZueKG4qUqQisnrJWj3Cl88c0KlXtsMew2s93l8OuJJS0g==', + version: '0.3', + creationDate: 'Thu Feb 25 14:11:54 PST 2010', + updateDate: 'Thu Feb 25 14:11:54 PST 2010', + accessDate: 'Thu Feb 25 14:11:54 PST 2010', + currentVersion: '7b0399826323da5fe938d8f17e2e03192b84af2e95e6d6dae0c8717a34cf4a72', + versions: { + '7b0399826323da5fe938d8f17e2e03192b84af2e95e6d6dae0c8717a34cf4a72': { + header: '####', + data: 'QZgYCpbzVvTd4KNRZW25SMXSyv0PWt7oje3nokC7TWSi/bdxcS8vQyosyFWWa9r4lDpO8/y7FYaa4O8b0ksX3MCOiQeQNI1a5+Bod9sZHWGnILwUnm8jVnuLcOrG/a69/ElLXdObwTXBvYDgHul1gIGWaV7cxYZmYFU1TlgPm0lklPrWqvteurZ8EzdBa9wrUOdKEfEWncn83Mn0KGXnm8xARYu51X4HSWrzKO5fpYqk5o223esndY4X/nLG416HAdPTCOwigMcqHV41asoc0pZRacQbqEhK56xAVKmTnquMt3oZVc/oRuW16ZajXl3A0I1U6ZASOBIZzSDaPW2vKYyEzLT2jxL3fq/GDgs8V5Ctlk8/b0Z4KjB/00NaikyLaVnEvPy4gBbzPHWNEOXjdAGynL/Ez73mNIgBEEUSviN5D2usydJYHF2mTFqldAy3', + version: '0.3', + creationDate: 'Thu Feb 25 14:11:54 PST 2010', + updateDate: 'Thu Feb 25 14:11:54 PST 2010', + accessDate: 'Thu Feb 25 14:11:54 PST 2010' + } + } + } + } + } + } + };}(), + + //------------------------------------------------------------------------- +/* + 'tt/tt_data': function () { return { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { + s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', + v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"77ecea1a9917ede00627788a28c6e90acdf7e5c12864cf236d1f41e718af7528":"1"},"data":"WrCX6cVPslFMYTvGWv7PVwWicAlBqB1I3QX0TNfxM6jrPrObeV4hRrRezUn1rLbQgXYFiuZdQ9mN8n51wNFcQvAXi0TcqmhIu23t6LI360ITPIwq9vNNEndt66ma6W1ANYcx6w+4uKga4ci5NA5vRwXN+s9M2G78HKApu3tvg1aayXmcr7FhoQ=="},"directLogins":{"index":{},"data":"h0MTipBOXYKi5HWM7eAEMw60"},"preferences":{"data":"Ws8wpQlRPwzQCt5hRWrKUUz3"},"oneTimePasswords":{"data":"eclAiKZ8snvT4Rwe7fCyUYXl"},"version":"0.1"}', + statistics: 'tfQF+BrjAQUWyiXWOMkWApmq', + userDetailsVersion: '0.3', + records: { + '77ecea1a9917ede00627788a28c6e90acdf7e5c12864cf236d1f41e718af7528': { + data: '1DGumxvp+09fSbLxed0wnGW5kh31ORuA7xhVOA==', + version: '0.3', + 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: null +/ * versions: { + '': { + header: '####', + data: '', + 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' + } + } +* / + } + } + } + } + }, +*/ + //------------------------------------------------------------------------- + __syntaxFix__: "syntax fix" +} \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js new file mode 100644 index 0000000..1cb92c0 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.data.old.js @@ -0,0 +1,172 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +MochiKit.Base.update(testData, { + + //------------------------------------------------------------------------- + + 'OLD_joe_clipperz_offline_copy_data': { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': { + s: '097ca38b1792023d6c1ffca50606b6040c6b27a7667e355ba9e54e6d47d8bf23', + v: '34b9f3ab193bb12dc93c791637b8d80364564b9a39ed7130cd168d52876914e4', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: 'AYppVPOTOWH06flUb/Ox61UZNSeDrqzI4x2c9pcBqgobvqnrqd31hxINSnItWiRAh2GPdh0vBElhwAzUQ0nN4wrEdV2hbkHdr+1W/nPt0phMHo0Jd+lHEXl51r+mJguMbMig3/pux9s+h6neWZOefyyTxGVVvVfIVBXYiL3DMVmaZFLOmTCK36LwyX2FltwI9vFSTSaoo14gytjukXM8kwRyUBxxa8agP1VJRtju5hbJVhBKEtXvviVGY8Xm2eMD7Jv5gpmKZcE/QeX1fnPbPPQIPVfbOGo5oKCQ8foDxXk4pnSY4uLZ/aB8CTK+d4cgfiOvPO0fyISA6kCFuNTaaFCBmvwX6h8ac6OWfaAn/3Fnl9C176KDpjdxYs5CCG4MpAVX8u4Gof8JmT/tI2PipbdjfeL37pSQoGM44icZCIE2Pa1Fybhl6WGyrqh3MT1dfxZpMyrzMBjb412KIUkykb8bTeDePK8+nZfwnxdxUQlV6q7RgzNlHZu8oU72PczTooLhsCJPQC/1BWMG5A1Xf8bie3eFo78QMQ+TqYEba7DbnvkcEBeODmrnUpL98SrHQHczssdsJsqDp4zxXWjMTqEZSb4+Yh2M/V3D/gLfE0ykDveABQlMpcpLGcjBjxN0XpBBn8J9vpaJLDM/Gs/LYzSgJpsmHA96iwTd1Nt8ZUjIEi5yDbi670xpCWgwHwjgeZpS5uLiV2Drte+M/nRKT8eJ/2K4E1o/3XEZEtzHax5qKrNPJayeD+2WB8bD4XJZ1ofEP+mwyOscKiO80DuQQueIrxrDZ1TX4TcqXaziduiJNBzinxw7yd9mW9ZIANatMbrMLzbRsfDoPks7xi4QUHlL9NSG0//I/p+mPOexHJqY3J2Y1u5CHiNA9EogsJmeUMeepMh01ogmWKLvoAOw7PsHfQlP8PBMBERubfvemi36WW6145ZN242OaPme6qm12NPgQTIKCsnUlW4ke+6ezd0P4EqpVSmJ9MMq58VsI4b/UTjhjQA8hntmvfLT+Rh8GpRWQ95ywRVgu2tzei7pVz+o/sWu8ziGke3/faDx/IpL4+0oprJTfuoQPD9XMntHHUoZvlyRInm8hZA5JgAr2UE3ApYKOWENoLDxb2gyVz8Y9pOHa8nXBrXrezCJzhIBOeFUK7E3TQfqpeI8Uokq8hy5k4mxoQ4IBeIxopYJ/O70uhOhN+mJt1xUorRW4FM2PujXeADCAieUQQcnIex7al6BYkzgors7YAWRW3JBpTcLBv73yXM0jXuC3mQ+0g4DmuT2lzuXrDSZbzXOG6jswDrgtgSkVkBqZp1jUP2oCy/ocd6lTHOC37tGUY8TkBFHD6QIzShzeEYLVAuAaMUmqterJKRvE3YTg/o/kibunk1AaUoloaDiemLwtWR8y3nBIUsj5B/tBhqGNbQTI2Q2ChN4tAIgNR/5oyohjLB4vhFXL2dqdAHxV6bQkN/ezkFFqUpPeQDTQ+gfS9fviIRb1EPvpE+d7OsJhvmV3hkTp4WZy50fbl4TTWGGgN6bkK3rWtH+9q4tHb19I/ZW4ZHwVuhSNtXQ1zwaCABlY/rLFfOIOe6kggSGvEdXmuC9dE3yy6X/bdejOFcMnINd45VwLvkYNztKkHeqrWcRc9P6VXyI9c4eEhR41ujcWiD7GrY1JwSmbS+FBYQCAxfEcmrGbk8r6jvtX11XwIy8yytGKP1zjYhitoLiQCDjLOkU/XuayrgZU7BfKlYvZfvel/+p61KtQZXb2VIFqJE+ipYbt+06BDARtH4GLExv40nrjSSeOQq6jJ1WqUjRPnQ2JU5TDpkpKCa6Xq6EDUOj2/arWR3JMxJGKDhkrwo9+d0V4l3Mle9iaUFtIJjtR7yK5U7MYhmXV0+0YMrLmwmjMyiaYWI9wjJQyk9CFMHzVcjdtJFoS6YMjyvRjgziR84knvkTxs2hUC17K9NJrwO+qo+nXAy9V23csZjY48TmP1EmaExCbl3NnU8iSNr5xPIL9xBPh7f2BM3Z6uIT0gdo+cA1mqPwIneA7VJfWbJSUudDITxUK7OuFJDG9WvtU4BJhR/2Nc9uBLuDuThvj+3Ix271ZWF2ZpI1crVrF2f8Oiut5ce0wLv9u79s+SQl3YQ7plIArugTMnfQcsiKC/+Mb4UImpVKekabQIbY80Jl/XE/ujpvpTpvqatBU9EMav+sF5q6uyBBz9eswU/66kZ/10uTzpE/XWjC43pGl4pvYpT6acrBh5HsaFQ81s1hT3O2ONhjqWvAlLmJJtLa9m+w7iPsSwiK/vAqUygjxLHqt2dmGt+DWwD8NwZ4jH69k3r5vOxgRjMHxjeoI8qhV9gDuXsFqfEP0jm7S5e7O7nHGi07fK7HdJmtg5E7toorf+ehej9kHXvb3h3gIUB/2uZvc82SutK04Bq2fhVtIj8mekLyvOu2ySfJNacxuR2wgaNIwI/HaVaveBwYsZGAQ3VtfQi0j9/1NzNKhnj/jTJheQ2ouwTwDEnwZusb+2enArPZD985096KFU9Ncj+FhTCfOSw1FrnCBVuY3EJ790D4npFpsjdztKVSy/6Pj6rJsgECCfcXR6UPoRYpezcSLqMldFGTHU3X8MM7GXdec2ZXlOEF9ztVgs6Ly5qxa1wgZ7EW8EAAa7wJzrkOZ+ea+DyNUNdk+oaToVh5Wz2QyGVmoyGvDV2ALPblqrpu9cBxpN/htib9jtrZAqSP3KZwzCFJGciF7l8UlsEBixobSB4rq4omj+CgO7A5YZdc0zCpXQ3H2DqBv/Y15Atmt+Ge+C7p+N+Cc2Dgz+yu1U6l4KJo4EbMgNex2Z5j3BveOSjU7zSnJBbQ+URYrm5WAz3lwiqhLLDYoxBxJVn8A+1bqS963MV4xtRLr2j5Ay1G1OPBIIL+ypiPk9J8TaGgqxAkQH8kga1pN9xkahc9RgRyv9fw7zyua8O9VSaOA9EvOY6WuaAkcAETXlpILw/SbYl2B1akYQPk3hGX5FrZ19KVzZ9so9CDuAkeedJEIqf6PCQ3lHPEjiftcYbf8Lb+3OFqPfaJgYtOHrbQwnooT8P7NI/hnEMKwx9Ps6Tf2tjg5khnTXk4yzuvIMQ6BbtrNRZN1gXCIKakLZJ+m//84sCrK3R2HyipJogFS28tKRn6uE4pk15Zrw3xjLVNTr58Qrhy4svTyeH9UmNN4rjIxfzKTLBXj94v58Z3/dKrXrteB64L2l+CQt9IFcLWI0iZjRdq+otXt/VIabg1jOQR9jGywnkHF1A9gOrg6ZgCJDzQqFXXiOkA0vul1UmdQzDpaBJgWmpZhIRr261V19OKdCplxKD+JfHoOroDoZq+pG85s8p0yN10MbPr/NZohG/QH4Vh/kXqcFhyqpQ5Ij8vwx3tzghDYcJtQExfNfaHIxSgahR53DHpD/2/sbb7Dbv3rjixhNMklnRRgbgwUuR0lrfG07rpTTNKZQFiM2lL2nY2nRMyAa6XuunY7tMDsWqRsq8YkVV3xoWN/RmZ/H50YWxXW29zFuA0x/kzfGDp8e9JMVyAFa9kZIsjOZvmXIP2ZiMI34QXxwbqXohymc2F6bQua9f/1Fe/UEcTLZSL6nL4IGa3P6Q4OJIv2I0W01HmEXo90SotOLyROtSJtXTiYFNBeS7oibEsWD4LCxDcUWqd9czq0BobJkEYcLNZ7lvsOYfKP53ySTli/+WnyqcppqM9rqVWmBXV62sTJ17r1dKmy8ACw2LBp+KB+c2JP0raZSi0WSWDFE8xm63QmDnMFddVWENcf+OTqOyc278i3nu3L3OhGbzc4OShI7gQ1o+AtrKWKdX8g9j9jwutZeM6tD6VQfxHOCo8/Yt0o9kHp+kkSy11eUavSYOjmui4fZYDVqvcKtOcrNvtbOTVCjQmuERIJuiFlip4qXJmSz3LMQWwEVTG/xY1nJJk4UHgVvqlAX04CuJvVOHsTY1MNkMVaKWd/EdNon0N5x31iiPO3Y2uYo/OsY3EI1YtCWYi8042eS0+q41fZp0rbFdVW+smBjrITsE07qWVFdMqb3NokIaIsHbuzLFvalXuJZ+eC8uZqD/hRy1kesMEfy5yR+JQlny55nf0EoA+V85rmkulTB2RgjhOJ2LlCX87YaocGFjwS71qFIUdix0UyfPZqU9kTEhWiWZwr+IJ11LutnBHgGKQi3MBk5ihpqhhIZDfjk6E3j712qEU6JxmG/Zfwq6xjBJqLKMHBEM28eu0Ev8/Xp4MoQye9ZzG9o2gDmjkbv6kRdz/PRYqp0r3LFgge3wENZd+UOZNWwFmlFpP9mwWdXtLDNOS+agQ96Z0aE6smS0jYR0w+TZMYjpAONDoqHSvATlXH1oVjHEoCIOymf5C3lVVHXbrEDsB1CJvRdQPv8C6vEC73i/r1K6m1GpBJsPo6sG8/zrbfCXdzl30RpBTeaDmcuzdzem/3QoFyV++jANRuxnyZqH6E5XUQU8s8T0c7pu3VWOQzHTHvkdusV23Mudt3/fYs6TiyBi2BPefrJFnkKD4j45ky6KvoxzC/HAGA1K1vj/7mOSa1acXUod0ZvFcUS8XLfakxl02LZG0NiYX6ZZIDoVH9g0DoTe8m3/75vJmIfidu4Pks8hO2w41zC48W6AYfXdBK9sQul9m1ZWi6tgauuO8Li6Fs7aaW1a1IdVp5Jvb8fyTP4cea6mbmNWXf3R6t9GDxE6BubmK8Pnaa7ErYSdBM6fmIQGf+YxILDG31/sMfkcI+fuamD+rjyNfVk20nPtWF2co7y1UNcOH7fdNml8SWwAoyF4Jy44JZXZ1YSdP6sl9Iegu3rQCv6fbimxw/n+ozwfT880oI/tVgsU0S31lBoTYXBfJQP4n+Byrs7AqUzqaXANDe+3qGVwywcVzpv9BYHREVSZF/nbmdWO8HDv2mBUcUnOvZG1DwOVxpvizVXRZBZWhEWuAkBTtDM01RVd8FJdTn2j9rHfd2wzRFMtirbtmU88LjdogvuacA60OZQPIuaR1o3CREMUs8VCDx5FCKF3V/TwRiuy3jpKxROxwVtK7KGCpXb9lLbYVZiqekzfdshgWjP5UirRPlI3xaNltCcN5Ami04hDSFahk3Rrv6uvCBHsFqPYswOEkXvqjGxqQKiEZPAa1HPTW2LHsTaoxhswWtjPUt+/zznX8lDaEgcYbkpYlz2jbDbgyojfO8MZoLko13vZwCsyb6YCe9iEQj/bw/KpY9fgtyhfUt0/hrEGOrtkUQl3wBV6Zm1hOePfKP4DzGPGM6thorVoCk/HyU4zqyjBy0TC1NHDD4N17b/pf5rpvo48eGz0csnhNKtqakYvKbw3t5vKEzhK6YNqT2HDCyAwyKof1+lULiAFtAaq9pkeESPrdRbd2eWv3KOnlz4FnaU6TJWX1t2QbMi9ASh/oDKyWJqWA4lnfx45umJVGs7UTn+SHcTlAptAPshQvu0QSoimABw/Bg4XwYfmAAVGxiBYdYRMtQjtdw+UHGXpZKd9g8KzLNFFB6EL+Wp4V3VxovbWPTzb9bOsPACkYoRLPN0+t377MXhcXczCOXZmR/3F+VkbokbYkbjGVaU4Ir8vCxLjbAx80eBMeM+Wz5uxm2CghZpuSl5qRh8SZXbpFFwb0r4HfWku4tTo6Rk5QppZeV0QSv47jHE5QLXuPEVb1G+s9QWulRHs89exJzdciLoQ8U60fAuWrvEeVTqBZrJ0w/RC0A9G7A7kMyVGTBxMurAFn4CZRknCSonC22Nj1dDV7stqPlIrd6o5Ki7JuvINp5rhv5mGbzCNeLpX9Woy6f/xfNoCQXPZRaZ70/k9qgzWozXZQfFJAlqoAV/SR8kN8uDthvANF5DN82JUDlYZSEWmYyCJj9ZkN0yx8tlrLwjkg72wIFw/4U/zWX35d31jGlMnGQjSL6kx2oZVqWiJOtbnLF4yrdPC5Q86Mc+uni+jUSdziAOtccvG/vewv+rrBEBUHt42uEdzO6utDyWcIlwcP7SafKtb0RMtfXog34c5/T0WqcI98yzSb0/FR6gXDzuKRUZEHL2r2JbYOKPioPEL0w7lFm7RW197RIEyvFy2oWh0luPcqA8p2z+bmwPJRHHa0pY8dkSKlPbSqRnalirxCPv+wyyNgMUwKjiNBrI4ww+o54v30L2yeNqAq2qzzzjJDYJhNBGHedceup6Exv9zIXe8a25tjyj7H3RPY6ulnBKvyTdsyYYo71vWSOHp08wKdB+8797MZA/KLHmK/GSwo8saMprL0Bv51mrie7Tvdk9tYsMDwNpwcE9Jki0lNnQ0ib+L2M5b5NiO3bQj4Vr2xfY1kA2pDxO4lufnzkA+znOA7vjaieiR07vI0ZcKNxrxlsZqfz/85ZcnGJ3p/1jVRZP9PSjdFBW/Ts57FPRMgfqOYaZOGlX4Zl53N35GUMdHOLk/E1POnC+ts95El5IOPNMfk7NhWFxMBpIH2Dylh6A+NOiTd5tz3nOWk671bFlvCo2M2P4clEYnYGrKsPQ+wrjGCxjuaOqkoFk8Z2KuSKOx1K3O+splezrQxg2HbYyISMMPmhFDgVdyLQgelPDnYsqxVtQadf2zF1lQGel9SfLAOD/ofnWK/mIth82220ov2bzFKRq/1RQx/BRLHVYTUAv9mDPxhZ5jKr1675UXNsvSaYZJSLWoy3nSqaO1jRiwr0oL9dKiOj2KBpSLL3HTy3Mfn75goD7TrMd2Wf1a+kcXm7bfq2T+0IFffzfaSh2Z1hY+ujk+3vpZDhvl94h08+UInkKmS6OwKgEN9zybTYq6a+2JHuAvXQb4k2z/DOqByMQgQAZyQGMlnRZEcQMhMc+hzhcz/7TDUWtx/6jWoC7DXm/qdtbTBN6RlR9IuFgM5wGjtU3oX6INEi3LiesiZzgq4lqBnoTOQ6vQbQ0ks+zkIZpl3zde+N84IUzONVnHZXZrq3iPg0QjGVByW5RK22emfBErmXZXCP48eRsLt9VgHxJTcBFE6w8qxcETtQSLiBhqMhXdKto6KDXx+dhkHB74uwGVbd50lTQdZ8esTBdNzEPeJkgx4NmGdlmnuq1eUr7UG1LJZmS4QyFjZ0Gm3TY6r0zklVusGo6memceEkyrTO0+IRiUf8DRrRinskBHqLGw6uvKZ9wsVwveo9sacKwLPHBX4RSDFqN11vCtpFuFYJgojXlo/3Msa3zm89OSRW9KYln/GbHOpuayLqQjUGnSZbJoETULWBsOTGKRT0WEnNC+/6BEKxD8wj4OxBTEjU1hP/97QZx6uswvuPsBDhlAAkN3i1Vn5xltsio11F/YrWqy0d54dHzGlyDViDvp9g64+R5n7VK5eqB2eaG6gH9U6INs9wPdxnu4f7limNl/DdXnJbvyMrJeQUGVkQncm287zewYcbl+2WIAR93b2QnHLSeN+FOSz/Ja6ezROFVKBte+28JCpBNCCTFk0czgHhS5mjNNnBYuLbu97ultfbO6Lt96dobEPnjTXQJ8bd85izSll2RNGSDzEXFMJe1tBMW5IORTHmknW5v4fKwlBsaFdnpaDKfk9LnAxYHVfiGIMkAV2Vhl7wnYyODW5WTXe7SOR6RuGBJ3KBE0VNMm0geO5NftZGSBpcyCVumKXxrHLuY0apQxmUkishr9NS0uWoZ9VYcMwrURQDUjUdI7tzoDareWnl1TsYw0cGYtdxz1Ptfr/xzAe4hjkDCZ2mUBB/ghcq/rtppEPmVphy4slIbmsfBpuT4yFdeLeQ9VZBneMsbOVj+gLVhApr5SC1bAP9b4UtFG0T0SUG+3DJLod7tP20A1/wcI+PdKgMsaM/5hPjskLQOj3d3cr1/UZUIpY6BpvY1ybT0JJgP5yKVpyidH6pCbclZixruclgjsm5eHkpaWMIoAPXo//VjGidbSFtVJIDiUhxtM3iHSyEcAf/YZXrkVrHNjN2n2NoobJAWx6bWdMWUDLg7eAeHio/VAhVTbav/dZwmKBp86BypAQy6w2TV/kYNc8fGcMkGoIv3rekRJ3XGNWo+NkaA/ugrQY5YofdUkKoDWoyCtR4z3unHLPKydZ2pBQNrVqB4kUgALYxqM5oDfGF6oJeRvP1/cPE3bCq4jTaLL4XKol8362T2YudDxs5kPHRrUClYShuuBCQflGC9hEvu3MCHmBhnXB+Sq34R9jr0gURJZkn7+W66YUK5TAq0465nCd+RaaXCeUhuYaJUuGZTqQEAO9ezDFGe+HgiIqXQkethZHvEy9zbi/wUBBND1a4NdWgPf7Q7UtCB2oGHB0xaKXXCJP1NYk6LKoV+rRyTrY/iHS9k6IbMd51sylgKvsIjurHRPfO7fIM3zdVp+R2/tglVAqJHfj0j95RAIdM7aMFYbCkCvNACCUZ4Uz0buJxT+3qM0geff1I0BoulqD88YzHHA9eAD/rsgXfR4SOtMtapwlpwIteTc+bfsnvtK+Ts0sG2XTx7f7rReZ1I09nRe2RzomIdr4dKC+pEmqjwNofdyY6D3SNvfYijI+nV52fmg+knOFaYsxg5juM+J50jInZXU3A9lDhWYW1TMunxXl5jpbD8m132RDNs0Qa16vhNp08kMu0ubS6GSUyJxo64gmRlfCbzgiZ4cirWry2rSBrB0zQqbwQY5Rw1L1NzOJy4Rh09pVDytLkvy/VfdUkQbjQ6RyBPaw1JUKJl1z1zYIgUQ1hwQa3O2Q1IvbN8V+TY/9jmGRJA98/ymbVki3JiNOhBfg', + statistics: 'iFI3fKfuUd5Tqj/iRCJnIk7isZ2FOYPr/yNfICm2U35oUeTJ/RA+l+kbWiYrecpIEgk=', + userDetailsVersion: '0.2', + records: { +/* 01 */ '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: '.....', + 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' + } + } + }, +/* 02 */ '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { + data: '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', + 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' + }, +/* 03 */ '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': { + data: 'B7RNc32W4K53PWYWQ4aUkqSLV2O4bwExYXVPFT+50MHxrhYt4/yh2idYXAooF1ImaIlvyUsIbI4EnIoBQ33ed2wxuSA9HVC4+wTrE05EfjYOw66yJO6R6TbIazOs0Fob5PJCFEW6evmb6WWf5KsHwifOo+ACMHK799yZ1dxfaIEjRBmLCtnc8sTNvo8i6McAf7WCffA1vXbyVPEhxJjmrfIDqvkWsNR7jDV5xIA021WicOS0FxOnzU3FecU7EF/UPcYjTKfe8IKw4nDXSKIIgXqCdzNYsyZkw2OnMDVJoSwNdfiog3H4zFy2m9KZqPjwnHHj5BE8rdx0JuZoSnTFLR05p4KdWfOU4BrjehAWXZdudYqsovtDm9uMLgUfx4DV/JKVmGAZ49GWM1Tx7pY5PBbJRTO3674FGWYHTPEMiIpDk+zt1sYIR2YBbJTq4fFOIPsgmOfvYdTkSvdHLk0fbxoK12w+atgmXAiNgE6T7DlYT0IMZlEesw0Spchxoo7lTBUPXC93bl/JugyhoRLUof4dxFvsIvd18Gnop+h7aCVW1S3lqZ36TG/N+hlM4U54FkpHjJi2fN8M8EKF0N8n399m58RNfsX2FriUVHozdb5gpgUXnQnVaAUrtv177lz0sRO+9KqbhJ16dCDzMFLcarBvXGqWkj+ZfkpNIaoyl8KTeHTQTbSS2IwLTvs69fbMW6Mub3VD81CXyY3MXyF4hT0U3CFVD4jQg+xODNnqqrkl/LebWy/XP/HOoNTxjygEu1JcS7zCptRagNoucXVkWinyKGjR9fSEltsrXG2pm4w2qsovRB3vfYp7kx2m5I9qc11K+JKhgPUmpm0S4BnPdfpRMXq0w8kxu08Mwm1Debhrzrgjw1/s1ZtcpoFgJv4EWLboWbo+CKWYdq0AGl+b5UHREPnGOM9o9bOg3uvaOEKZyMq8wxECBjdas4wjRbMY83PcBfzCbOU+POrcbalmtwn4/ILkHPsUcaOHYcnKwkxSYIDRxQc69mHw1+vilSHUQ5dZYSWIRvV3yPe9eqZPWJsWrOyhPLCf18BoNdfbgHFL7b2KN9xLMz0tdHxVozH2TnwAavcNqAE0hVIgtyEDoT4rI7FVMSu5mCIN2KOxgXB8XREZokT1BQ8+rz6JraS3JYQNz+7Bd6iB6OaTStsFoaBkj50MszNdwhRViOCCUk4bUr45XRtyh4ZEXj/I4pyJUkhR5H8/qKKD', + 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' + }, +/* 04 */ '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 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 05 */ '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { + data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', + 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' + }, +/* 06 */ '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { + data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', + 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' + }, +/* 07 */ '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 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 08 */ '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { + data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', + 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' + }, +/* 09 */ 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': { + data: 'YXBq1ZlFhoosb2Krnk0Tk8+LKyecTeZ3UdJujrryEgvMnhGJvSVVtN3uph9gts10Kw+tF5wvdAtBFdMUpvcP3mOlbnX7+HCz+JsJcLLVvuGBU9ciwok5kRKQuvWffmP7qFLuqO2VJUj2ozjcpVssStZOrfDXWrJwYfkd9IMnOJVmCwjFeXpPlkOeHNyhjPlfZhWWlTga6xLdEXaVeZyjDegzhlhh9U3e1CLupLTwdxXtNCPRXp8gU7e/I9HP/qdnj5BzgDxaKx29v/AUcgOt3jq5oWwePXZL9nVOp6rh/UqduM88tyxEbnBQxcGj9KxTVsIh6ywzQZgnPtfrPaqX4Fvb1P9cGN80/F+/JXVgL3fvrcxJDGxZj6VYFTA+cHM6sV+F4/7wMLUVlCcn78BB6/k3DC4mYUv+8LSxfZf22bWCcSyubPTRhmCm2/sgdOloDUKT4AjfZivlpJjkYNDtNmZn/rUpMr3uLiHeWDDNB+eGqk3lAFhihBPXqDJ3o+8c9jrznedMxQPkgYD0V9ryDauY2RYjQIhmXqQlnGxpGOO2lFDGYtkwsBplPy6LDkudzJVAqp5trBR8Ty87k65hbhinGCra/DgPqIxjaN5pvZbXkOLoaIoLnE9RRGdAwfUTMIg/maNRoDKaHO0hJ3ksCflu71H9tzPjGM7BBjWjQgUvwDJOgnEPyZv+noOiHfNIq3u8CfI8e867gnEbdtd3oPYex1aBYIQ1ELAxI8szUtSeMDHOouXrZKwy04xVdC90KHnVWl49scE2QfgqV4hqzFjtuQgZOqQ50bI+duWDm7YYTwKVlo5QKy40faW6dPIfDPRsxY6M3gcL2OPBm+WMopUC/o/AFSpxPaut1DOr3mXBip0Ejam9xmJhMOUwIJDoE2U+8S2s+UJjRunLb680vqbddF24aWxpLL1Fg+hlRZ/Jz1ZajonH9ktQhoQaTl+w/4uHhMZjKH7/FaRqge2WMMwVjOd7VXNByBPia6W7VbmDk8LFCeCsC1DchcDaMj/JmoGXucqzDO/sOIby2YCBsV72ReqTNtu6SLZe4G61DWA7j+6NiOSmAutYox6VsoRsKaJYkyBgmq5hWDZmWOJ/cC1pQa9EMoXzcaEPicmXx5YE4xF15VWpI8cKTM/StLtLcqTs78Z0fQAicz8YhhNdVCGp/zcjJRPyL6XCDhpvMxcIOnU7', + 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' + }, +/* 10 */ 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { + data: '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', + 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' + }, +/* 11 */ 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': { + data: 'Ate/x8b4UWG3C+gZ7IzIfZrHSlh3eSANVYtd034pXi4V73+rc5OynELEiMxDgvcr+4r5YGNPKvTB83KzOBznmZsEJhNpCd2Ezyk1i3FEo+Wur/6EYBBvDfHSQNrRfYVcNlx6+i1d6a6lDYxOcxfEPuL2141KsCRxCId4FWvDU1Om48ekFNyeOl5ND+k4GLymYIjG7HC6VQZOwUQgzlTfZpjeJ1q3pdPWSEtX8a0b5pgmHVB9X56u+vjfYFcs2ieh3UcR4Vg8fIJQOth/pE2XoZfbALyT3pnEcW8vQrrmFcavt9bDGGzlEkGB9JEIyMzUqVndV9Sw5OsCMgOEpMKvELRnlyieUvcsYSL1s/m8GohguMrXDiRV/nCUhZbH/j/8jXEX4kfiaIT5uvPBymTyMTGGLoPBT7mOWLuV6NoU6ND0QwSEXNMpZDJDBhl37hR4kD3GgjCv9gjasADAmHPZF386LNxnOIMTfrOIwK3sXkfhEU9EKdC+QT+W85o6HQrWXsqNesxU2cs2uW7rmadUBoQdyYTtWH3cBWcwKH56vzlOG33JG1+DGH6MFEd4vn1I0aoluPuBom9ERgLXEoqw1tx4OAx8UCcev8dnZF1YcGhcUXyORjgjd6CTfMDz+f5YMkulGwPRcm1D7uof0a2ryV6+c5WuccUX+Pe/Vj3WOQXts7pdukLp+idnlpdSw4roJWU++1i7727MIWGUFcKMH6qyH2yZ1nxLNour/u6FYlxRvNkB+vCr+hko7iBlTw2GMVWUMgnFS0A+lQ1tGawAM9h8lpb75GCbiWNXdnbTx/GdQzKMJJXKGpOeuWOXlJSEJHjWzVwbP21ql1OaFLr9ihUJdLzSsjICW7pGH/iuhuIlx84N57ctV2BTAYJtPLG+f3rv709lOD/5pgdXTLijjX473Ymq0TgGBSI9am0Pwz7SB2k1LVkBVfAVxR6p8Vb0h3S1LUojoJS5dfGV7TtTu67CemoRNISdOVL9kxCoue1QMsd7GTnY3sy/P4eFHovCtU0suUYjHRojUz5B6xPlL92Jbdtq6fGv+V+p/HnKFXkf3BgPnSm2zexCAEgT8yuJ86UIIWIEhYN1UtzJVJ6BykCCGbZrCSEHyfCcRLreYYpNcMPWpLOLTMFpLiHtW6+x6/tVB07K2NDpYZUY4Ekym4bRrLUXtDjjcltL8qUPQf/uBU6tfpGrdZB5OAWnsxzR0x+4ycyz84Pq81NMUVKnvhUWrygtatZhFYhNWYCz4NRfqwnwSRQxTr/2NliO22BhGc6fjZWdXdqmyw1+UXVp692nsV2FCldz8+k6LMA0AKBuQXcK5v4mYQOWmSKlH/CpkPkOEIPrQVmgjMv1/qWaEIvRJUYpPsnFUD5a12NlBBxBvHpcXemHZZvdgnBnOyAjIbhxCAsQnw2Rc6SzF1z4yviZ8PSeh5+zavbI9rgO3UtsPBO+R+5kky3KxtnLSV9m6m6Lb1QmpwDKQ2ddTDXFLBasyE0WdrCDBTDpCLDRsLWdODzyeCH0yWx8tfKfKRI5dzBQz4xJ9swkC3LAr7XubkCw8RMzCUAC/WKMRIsoyXMP2Il38fSG1aO6kKyUvY6ai8a8IDx3Do5TQMgS53N4tQNls8ZcglYDydcXhxsH7ztEjis/2omJbwadtTRYv7fu5jbZAC21XcGhfbgPp8h3Zal0SwuN6s+Uyz8LSwnZgrN0N6d2cNE39628kZkAwI7piZG7VV0XocrGnIu+6oe0QmJsxiAMvaheh0K9Dkf98rS2OF3LDwosaSzxUBD06BD1C2BkleM9', + 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' + }, +/* 12 */ '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 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + }, +/* 13 */ 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { + data: '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', + 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' + }, +/* 14 */ 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': { + data: '3sIazRfi2ps3Mh69YkIYFFyDRXU8cTRuBjCevCJHyJOfxLPOcJfUX+QuWv50QMRchAG1RYTwqTOFd4G4ixzmt9HjHlJSpFXva8TvNfUaoggUWWTzNraRxB0gJex3JGfQd4Nlve+wdISrn5vUJSWBYcFEFo9504TcDAkVjwFYrLhBDFv53d3B5WuanLzpRuB8lIj5r5ZBYszraRDeSjEKQ0OtTojxnkZOB7dDi2IYdorhxhOeBmi3ucAXeDLZbaZdPAXmo6CNEYxAr0z9/aCrvLxZEfNoBvBMOnHT20wljSGsjf6QG/KEm352ix/uGSrJNbRMMX9tVloeSmEkwxkAn4ZQwIVq/0IS970MkL+jOH/RFhO6UT6x5OPo+Yyf3EKmRWKKeZbv95C5WNRcfLjeNVo5Zihq4fAUEfwHtNTaEEpLoUdCbzgZqBKcbLk8jo44lznz41T4R9QM5ofRAexywqVlEzagztakcrgyAMGumqquuKscJmqxEyxZLwNWD706DCUkiG2a1m/umxNvVkCNE6VBxbZ1+SPrcsRVfdtAx3eee056xo+KYKLdf84j3DR27H/p3QYm25sdLhUU0QtUTDTP2aKUxEcsLy5MIZV7256AlRS23upmvtb+VfJCsT+FwedLNCzu4SEk8Iz5AHFJ2VZ0g/2A7DH7DiuaxSqEn6iSqVZRnTrhWsW/lTZ61Swji+wvzk+5RnY8wBFZeudUX6ERy9n0e4n8EkGXCObwSnyIe+Dxs32MQFXb7b6NUJEfbq4GxHUjJ6fzRuTqQysRKlQ+qj9Hl5+HvGhyliDpe+PQ3V6kFE52qVArAYzlR2sZJmxKPIgU6wPPuCMcg+97own4gSO6PWrnlSZs87ptZdZ1iiYPDajQjyLI9WV/IN3APbiRufdEjjmCkoxB1zwSHzyW50Wdl1pEW19/0j+KSFDeigXXVg0LAko4uuJIPTLR8L8gOrcNZvIqHB85XnsbO49+SUwcykXSlZSq3il7D/9FuGJK0ecKdEMf/UetsSaX7x3L92fzSIjqgFSHrCPrqLVWdI5Sema4vhx3aes+hF9oohC9jqb6vS/b/vXfVf2vs2hPelqk7UIRzPmaeapzF0RyjGoAljBIrPFmyAmXcpQ/NlJSI7UjMjoFWsOXshJiy+0/luVkzfoFSordVm2ZhR9zkVKKDHlrFXXkw1upVnf1xFV9Z4SEVAZKgWRr2vLbmD5tITmR7qxzNTXrikqujVvOeFCHkAW1c5IcOk/VjPO36CNL2EZbpRHc6z25gST8NYn+Ypee6FGliHGFbzJxTwHa67fRncf9H1Iunzl+x3J3/0973z5fILk4OtMq3MKUFjdj2r+hqwU893+Yaza7l06Jm+dODTXhPA0T+JL4gaWHE4Ci9SsX85uvpZR++Tfx3CB7uXvOKGATmVYkAMndNCOBCbHz1/zz/Fg4Awu4aAPap/DqWsoVXajuYBSBNpaxpFWeioX65PPEPgn+HHmtjn2c647vwdv3iBopTJJlipoW94vkTJe4tpO1e7DA5EPnzdxJoRyXGbipfCRlfblcurQP+hXZHobfqmzMuyEPp4t7b5oiYpwzNnM4/sh9NxTpj/a4urjnIwg8yzLNvdletAuME0oQu4DkcWpPKhyDpelAPtdhDka2YID/WhUfg+gHKpIjKU271eoUwhScCcW1cBY41htaSNftJq96r77piMYo6EAAuf4X++MIT5LiwsYs/qzjOrmQm5pdSeAmR9f1fkqsIAv/TDhgAgIC0zAmvUJfkxIEHOMn4y5i5qZqlDS/Nvd/ZWl0lMjPSJaxd1pm3echWZ8/+gPKMib5sSO2eYYOMq/DR6k2ILThbHJp1G6gqcyD/LymNO7BrCIDfGEgp+fCBFXYBjC6+Otkukcvxs1uJsirwWbYLaoC25iYChdhwmoOys8=', + 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' + }, +/* 15 */ '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 15:46:44 CET 2007', + updateDate: 'Wed Mar 14 15:46:44 CET 2007', + accessDate: 'Mon Jan 19 16:10:04 CET 2009' + } + } + } + } + }, + + //------------------------------------------------------------------------- + 'syntaxFix': "" +}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html new file mode 100644 index 0000000..f77bcb6 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.html @@ -0,0 +1,106 @@ + + + + + Clipperz.PM.DataModel.User - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js new file mode 100644 index 0000000..4e7a21f --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/User.test.js @@ -0,0 +1,2082 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'invertIndex_test': function (someTestArgs) { + var testIndex; + var invertedIndex; + + testIndex = { + 'key1': 'value1', + 'key2': 'value2', + 'key3': 'value3', + 'key4': 'value4', + 'key5': 'value5' + }; + + invertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(testIndex); + + SimpleTest.is(MochiKit.Base.keys(invertedIndex).length, MochiKit.Base.keys(testIndex).length, "the inverted index has the same number of elements as the original index"); + SimpleTest.is(invertedIndex['value1'], 'key1', "the first element has been correctly inverted"); + SimpleTest.is(invertedIndex['value2'], 'key2', "the second element has been correctly inverted"); + SimpleTest.is(invertedIndex['value3'], 'key3', "the third element has been correctly inverted"); + SimpleTest.is(invertedIndex['value4'], 'key4', "the forth element has been correctly inverted"); + SimpleTest.is(invertedIndex['value5'], 'key5', "the fifth element has been correctly inverted"); + return MochiKit.Async.succeed('done'); + }, + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_test': function(someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + is(someRecords.length, 20, "joe_clipperz_offline_copy_test - joe has 20 records"); + }); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); + deferredResult.addCallback(function (someSortedLabels) { + SimpleTest.is(someSortedLabels.length, 20, "We got all the labels"); + SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); + SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); + SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); + SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); + SimpleTest.is(someSortedLabels[4], "Example Attack", "The fifth label is correct"); + SimpleTest.is(someSortedLabels[5], "Expedia.com", "The sixth label is correct"); + SimpleTest.is(someSortedLabels[6], "Google Account", "The seventh label is correct"); + SimpleTest.is(someSortedLabels[7], "Home burglar alarm", "The eighth label is correct"); + SimpleTest.is(someSortedLabels[8], "Jaiku", "The ninth label is correct"); + SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); + SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); + SimpleTest.is(someSortedLabels[11], "Microsoft Office CD Key", "The 12th label is correct"); + SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); + SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); + SimpleTest.is(someSortedLabels[14], "SAP - Login", "The 15th label is correct"); + SimpleTest.is(someSortedLabels[15], "The New York Times", "The 16th label is correct"); + SimpleTest.is(someSortedLabels[16], "Web password", "The 17th label is correct"); + SimpleTest.is(someSortedLabels[17], "Web password", "The 18th label is correct"); + SimpleTest.is(someSortedLabels[18], "Yahoo! Account", "The 19th label is correct"); + SimpleTest.is(someSortedLabels[19], "del.icio.us", "The 20th label is correct"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_getDirectLogins_test': function(someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("joe_clipperz_offline_copy_getDirectLogins_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(someDirectLogins.length, 22, "joe has 22 direct logins"); + }); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); + deferredResult.addCallback(function (someSortedLabels) { + SimpleTest.is(someSortedLabels.length, 22, "We got all the labels"); + SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); + SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); + SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); + SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); + SimpleTest.is(someSortedLabels[4], "Example Attack", "The 5th label is correct"); + SimpleTest.is(someSortedLabels[5], "Expedia.com", "The 6th label is correct"); + SimpleTest.is(someSortedLabels[6], "Flickr", "The 7th label is correct"); + SimpleTest.is(someSortedLabels[7], "Google Account", "The 8th label is correct"); + SimpleTest.is(someSortedLabels[8], "Google Calendar", "The 9th label is correct"); + SimpleTest.is(someSortedLabels[9], "Google Docs", "The 10th label is correct"); + SimpleTest.is(someSortedLabels[10], "Google Mail", "The 11th label is correct"); + SimpleTest.is(someSortedLabels[11], "Jaiku", "The 12th label is correct"); + SimpleTest.is(someSortedLabels[12], "LinkedIn", "The 13th label is correct"); + SimpleTest.is(someSortedLabels[13], "Lufthansa", "The 14th label is correct"); + SimpleTest.is(someSortedLabels[14], "My Yahoo!", "The 15th label is correct"); + SimpleTest.is(someSortedLabels[15], "MyBlogLog", "The 16th label is correct"); + SimpleTest.is(someSortedLabels[16], "MySpace", "The 17th label is correct"); + SimpleTest.is(someSortedLabels[17], "SAP - Login", "The 18th label is correct"); + SimpleTest.is(someSortedLabels[18], "SAP - Login", "The 19th label is correct"); + SimpleTest.is(someSortedLabels[19], "The New York Times", "The 20th label is correct"); + SimpleTest.is(someSortedLabels[20], "Yahoo! Groups", "The 21st label is correct"); + SimpleTest.is(someSortedLabels[21], "Yahoo! Mail", "The 22nd label is correct"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getCredentials_test': function (someTestArgs) { + var deferredResult; + var user; + + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("getCredentials_test", someTestArgs); + deferredResult.addMethod(user, 'getCredentials'); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.username, 'joe', "the username of the credentaials is correct"); + SimpleTest.is(aResult.password, 'clipperz', "the password of the credentaials is correct"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loginWithOfflineData_test': function (someTestArgs) { + var deferredResult; + var user; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("loginWithOfflineData_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }) + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getRecords_fromOfflineData_OLD_test': function (someTestArgs) { + var deferredResult; + var user; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function(someRecords) { + SimpleTest.is(someRecords.length, 15, "the OLD test user has just 15 records"); + }); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); + deferredResult.addCallback(function (someSortedLabels) { + SimpleTest.is(someSortedLabels.length, 15, "We got all the labels"); + SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); + SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); + SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); + SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); + SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct"); + SimpleTest.is(someSortedLabels[5], "Google Account", "The sixth label is correct"); + SimpleTest.is(someSortedLabels[6], "Home burglar alarm","The seventh label is correct"); + }); +/* +*/ + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'getDirectLogins_fromOfflineData_OLD_test': function (someTestArgs) { + var deferredResult; + var user; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("getRecords_fromOfflineData_OLD_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['OLD_joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addCallback(function(aResult) { + SimpleTest.is(aResult.result, 'done', "successfully logged in"); + }); + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function(someDirectLogins) { + SimpleTest.is(someDirectLogins.length, 17, "the OLD test user has 17 direct logins"); + }); + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('label')); + deferredResult.addCallback(Clipperz.Async.collectAll); + deferredResult.addCallback(MochiKit.Base.methodcaller('sort')); + deferredResult.addCallback(function (someSortedLabels) { + SimpleTest.is(someSortedLabels.length, 17, "We got all the labels"); + SimpleTest.is(someSortedLabels[0], "Amazon.com", "The first label is correct"); + SimpleTest.is(someSortedLabels[1], "American Airlines", "The second label is correct"); + SimpleTest.is(someSortedLabels[2], "Bloglines", "The third label is correct"); + SimpleTest.is(someSortedLabels[3], "Digg", "The fourth label is correct"); + SimpleTest.is(someSortedLabels[4], "Expedia.com", "The fifth label is correct"); + SimpleTest.is(someSortedLabels[5], "Flickr", "The sixth label is correct"); + SimpleTest.is(someSortedLabels[6], "Google Calendar", "The seventh label is correct"); + SimpleTest.is(someSortedLabels[7], "Google Docs", "The 8th label is correct"); + SimpleTest.is(someSortedLabels[8], "Google Mail", "The 9th label is correct"); + SimpleTest.is(someSortedLabels[9], "LinkedIn", "The 10th label is correct"); + SimpleTest.is(someSortedLabels[10], "Lufthansa", "The 11th label is correct"); + SimpleTest.is(someSortedLabels[11], "My Yahoo!", "The 12th label is correct"); + SimpleTest.is(someSortedLabels[12], "MyBlogLog", "The 13th label is correct"); + SimpleTest.is(someSortedLabels[13], "MySpace", "The 14th label is correct"); + SimpleTest.is(someSortedLabels[14], "The New York Times", "The 15th label is correct"); + SimpleTest.is(someSortedLabels[15], "Yahoo! Groups", "The 16th label is correct"); + SimpleTest.is(someSortedLabels[16], "Yahoo! Mail", "The 17th label is correct"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'sortRecords_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var caseInsensitiveCompare; + + caseInsensitiveCompare = function (aValue, bValue) { + return MochiKit.Base.compare(aValue.toLowerCase(), bValue.toLowerCase()); + }; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('0')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'"); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('5')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Expedia.com", "Sorting the records themselves (by labels), the sixth element is 'Expedia.com'"); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(MochiKit.Base.compare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('19')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("del.icio.us", "Sorting the records themselves (by labels), the 20th element is 'del.icio.us'"); + + + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('3')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("del.icio.us", "Sorting with case insensitive mode (by labels), the fourth record is 'del.ico.us'"); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(Clipperz.Async.deferredSort, function (aRecord, bRecord) { + return Clipperz.Async.deferredCompare(caseInsensitiveCompare, aRecord.label(), bRecord.label()); + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('19')); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Yahoo! Account", "Sorting with case insensitive mode (by labels), the 20th record is 'Yahoo! Account'"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'accessToSingleRecord_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Amazon.com", "Sorting the records themselves (by labels), the first one is 'Amazon.com'"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'accessToSingleRecordContent_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("sortRecords_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(function (someRecordFields) { + SimpleTest.is(MochiKit.Base.keys(someRecordFields).length, 2, "The number of fields of the Amazon.com record matches"); + return someRecordFields; + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.collectResults({ + 'label': MochiKit.Base.methodcaller('label'), + 'value': MochiKit.Base.methodcaller('value') + }) + deferredResult.addCallback(function (someValues) { + SimpleTest.is(someValues['label'], 'email', "the first field label matches"); + SimpleTest.is(someValues['value'], 'joe@clipperz.com', "the first field value matches"); + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordLabelAndCheckForPendingChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordAndCheckForPendingChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Amazon.com", "This is the record the test was expecting"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "New label")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "setting a label on one of the user's record, trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("New label", "once set the new label value, I can still get back its value"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes should return to the original state"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Amazon.com", "The label of the record is restored to its initial value"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordFieldsAndCheckForPendingChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordFieldsAndCheckForPendingChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.addCallback(MochiKit.Base.methodcaller('value')); + deferredResult.addTest("joe@clipperz.com", "The value of the record field is correct"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', 'joe@example.com')); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.addCallback(MochiKit.Base.methodcaller('value')); + deferredResult.addTest("joe@example.com", "The record field correctly returns the newly updated value"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of a record's field trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes should return to the original state"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(MochiKit.Base.itemgetter('5e822c34aaf1a9fbc0b52585c1915f3a3758abd51923a4d35ae85373bbb839c2')); + deferredResult.addCallback(MochiKit.Base.methodcaller('value')); + deferredResult.addTest("joe@clipperz.com", "The original value of the record field is returned after reverting the changes"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordNoteAndCheckForPendingChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordNoteAndCheckForPendingChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("aproofofconcept\n", "The value of the record note is correct"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "A new note text")); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("A new note text", "The value of the record note has been updated"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(true, "also the record should flat its pending changes on the note field"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes should return to the original state"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("aproofofconcept\n", "The value of the record note is restored to its initial value"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loadUser_withoutPreferences_andTryToAccessThem_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("loadUser_withoutPreferences_andTryToAccessThem_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.collectResults({ + 'preferences': [ + MochiKit.Base.method(user, 'getHeaderIndex', 'preferences'), + MochiKit.Base.methodcaller('getDecryptedData') + ], + 'oneTimePasswords': [ + MochiKit.Base.method(user, 'getHeaderIndex', 'oneTimePasswords'), + MochiKit.Base.methodcaller('getDecryptedData') + ] + }); + deferredResult.addCallback(function (someValues) { + SimpleTest.is(Clipperz.Base.serializeJSON(someValues['preferences']), '{}', "The preferences are empty"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordTitleAndCheckForPendingChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordTitleAndCheckForPendingChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "The value of the record note is correct"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Edited card 1")); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Edited card 1", "The value of the record label has been updated"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); +// deferredResult.addTest(true, "also the record should flag its pending changes on the label - 1"); + deferredResult.addTest(false, "changing just the label (or any other attribute stored on the header) should not trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes should return to the original state"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "The value of the record label is restored to its initial value"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordTitleAndCheckForPendingChanges_take2_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordTitleAndCheckForPendingChanges_take2_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "The value of the record note is correct"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Edited card 1")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); +// deferredResult.addTest(true, "also the record should flag its pending changes on the label - 2"); + deferredResult.addTest(false, "only the label has changed, and this should not trigger the 'hasPendingChanges' flag on the record as it is stored in the header"); + +// deferredResult.addCallback(Clipperz.log, "======================================================="); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "Card 1")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "Setting the old value back should void all pending changes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(false, "also the record should not flag any pending changes, as the original value has been restored"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "The value of the record label is restored to its initial value"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordNoteAndThanResetOriginalValue_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("modifyRecordNoteAndThanResetOriginalValue_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("aproofofconcept\n", "The value of the record note is correct"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "A new note text")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "aproofofconcept\n")); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "setting the field to its original value basically reset the change, like 'revertChanges' would have done"); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'modifyRecordNoteAndCommitChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var newNoteText; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + newNoteText = "A new note text"; + + deferredResult = new Clipperz.Async.Deferred("modifyRecordAndCommitChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest("", "This is the original value of the notes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', newNoteText)); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(true, "changing the value of record's notes trigger the 'hasPendingChanges' flag also on the record itself"); + + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 1"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('notes')); + deferredResult.addTest(newNoteText, "It looks like the data edited was correctly stored and reloaded here"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'multipleModificationToRecordTitleAndCommitChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var user3; + var newRecordTitle; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user3 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + newRecordTitle = "A nice new title here"; + + deferredResult = new Clipperz.Async.Deferred("multipleModificationToRecordTitleAndCommitChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "This is the original value of the label"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', newRecordTitle)); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 2"); // FAIL + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest(newRecordTitle, "It looks like the label edited was correctly stored and reloaded here"); + + deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', newRecordTitle + "-" + newRecordTitle)); + deferredResult.addMethod(user2, 'hasPendingChanges'); + deferredResult.addTest(true, "changing again the value of record's label trigger the 'hasPendingChanges' flag also on the new user"); + + deferredResult.addMethod(user2, 'saveChanges'); + deferredResult.addMethod(user2, 'hasPendingChanges'); + deferredResult.addTest(false, "after committing the changes, the user has no pending changes"); // FAIL + + deferredResult.addMethod(user3, 'login'); + deferredResult.addMethod(user3, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest(newRecordTitle + "-" + newRecordTitle, "It looks like the label edited was correctly stored and reloaded here"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'saveChangesWithADeletedRecord_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("saveChangesWithADeletedRecord_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "This account has oly a single card"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "This is the initial value of the label ..."); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(aResult['updated'] != null, "There updated key is not null"); + SimpleTest.isDeeply(aResult['updated'], [], "There are no updated cards"); + SimpleTest.ok(aResult['deleted'] != null, "There deleted key is not null"); + SimpleTest.isDeeply(aResult['deleted'], [], "There are no deleted references"); + return aResult; + }) + deferredResult.addMethod(user, 'revertChanges'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethod(user, 'deleteRecord'); + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.isDeeply(aResult['deleted'], ['8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'], "The deleted record reference is correctly reported"); + return aResult; + }) + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.shouldFail("accessing the deleted record reference should raise an exception"); + + deferredResult.addMethod(user, 'getRecord', '0000000000000000000000000000000000000000000000000000000000000000'); + deferredResult.shouldFail("accessing a fake record reference should raise an exception"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(0, "after deleting the only record, there should be no records bound to the user"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'revertingChangesAfterDeletingACard_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "This is the initial value of the label ..."); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(aResult['updated'] != null, "There updated key is not null"); + SimpleTest.isDeeply(aResult['updated'], [], "There are no updated cards"); + SimpleTest.ok(aResult['deleted'] != null, "There deleted key is not null"); + SimpleTest.isDeeply(aResult['deleted'], [], "There are no deleted references"); + return aResult; + }) + deferredResult.addMethod(user, 'revertChanges'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethod(user, 'deleteRecord'); + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.isDeeply(aResult['deleted'], ['8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'], "The deleted record reference is correctly reported"); + return aResult; + }) + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.shouldFail("accessing the deleted record reference should raise an exception"); + + deferredResult.addMethod(user, 'getRecord', '0000000000000000000000000000000000000000000000000000000000000000'); + deferredResult.shouldFail("accessing a fake record reference should raise an exception"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(SimpleTest.ok, true, "after reverting all changes, the deleted card is restored"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'lockUnlockAccountAfterDeletingACard_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var recordID; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + recordID = 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'; +// recordID = '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'; + + deferredResult = new Clipperz.Async.Deferred("lockUnlockAccountAfterDeletingACard_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(20, "Initially the user has 20 cards"); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(22, "Initially the user has 22 direct logins"); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addMethodcaller('directLoginsData'); + deferredResult.addMethodcaller('values'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(22, "There should be also 22 direct login references"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(4, "The selected record has 4 direct logins"); + + deferredResult.addMethod(user, 'getRecord', recordID); + deferredResult.addMethod(user, 'deleteRecord'); + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(true, "after saving changes, hasAnyCleanTextData should be true"); + + deferredResult.addMethod(user, 'deleteAllCleanTextData'); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(false, "after deleting all clean text data, hasAnyCleanTextData should be true"); + + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest((20 - 1), "After deleting a card, only 19 are left"); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest((22 - 4), "Initially the user has 18 direct logins"); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addMethodcaller('directLoginsData'); + deferredResult.addMethodcaller('values'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest((22 - 4), "Once deleted the card, there should be just 18 direct login references left"); + + deferredResult.addCallback(function () { + SimpleTest.ok(true, "nothing wrong had happen 'till here"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'lockUnlockAccountAfterDeletingACard_2_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("lockUnlockAccountAfterDeletingACard_2_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(someRecords.length, 20, "Initially the user has 20 cards"); + }); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(someDirectLogins.length, 22, "Initially the user has 42 direct logins"); + }); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addMethodcaller('directLoginsData'); + deferredResult.addMethodcaller('values'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(function (someDirectLoginReferences) { + SimpleTest.is(someDirectLoginReferences.length, 22, "There should be also 22 direct login references - 2"); + }); + + deferredResult.addMethod(user, 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); + deferredResult.addMethodcaller('directLogins'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(someDirectLogins.length, 1, "The selected record has 4 direct logins"); + }); + + + deferredResult.addMethod(user, 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); + deferredResult.addMethod(user, 'deleteRecord'); + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'deleteAllCleanTextData'); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(someRecords.length, (20 -1), "After deleting a card, only 19 are left - 2"); + }); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(someDirectLogins.length, (22 - 1), "Initially the user has 21 direct logins - 2"); + }); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addMethodcaller('directLoginsData'); + deferredResult.addMethodcaller('values'); + deferredResult.addCallback(MochiKit.Base.values); + deferredResult.addCallback(function (someDirectLoginReferences) { + SimpleTest.is(someDirectLoginReferences.length, (22 - 1), "Once deleted the card, there should be just 21 direct login references left"); + }); + + deferredResult.addCallback(function () { + SimpleTest.ok(true, "nothing wrong had happen 'till here - 2"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'simpleSaveChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('label')); + deferredResult.addTest("Card 1", "This is the initial value of the label ..."); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "New label for Card 1")); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setNotes', "Setting just the label would not trigger the update of the record data and nothing will end up in the 'updated' list")); + + deferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords')); + deferredResult.addCallback(function (aResult) { + SimpleTest.is(aResult['updated'].length, 1, "The updadated record should be listed in the changes getting ready for commit"); + return aResult; + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'saveChangesAndDataCaching_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var record_1; + var record_2; + + record_1 = '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'; + record_2 = '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("saveChangesAndDataCaching_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "The card data should have not been loaded yet"); + + deferredResult.addMethod(user, 'getRecord', record_2); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "Also the other card data should have not been loaded yet"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('setLabel', "New title"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "Changing just the label should not trigger the full loading of the card"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('setNotes', "New note text"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(true, "Changing the notes should trigger the loading of the card"); + + deferredResult.addMethod(user, 'getRecord', record_2); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "Changing record_1 should not trigger the loading of record_2"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "changing the value of record's label trigger the 'hasPendingChanges' flag"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 3"); + + deferredResult.addMethod(user, 'getRecord', record_1); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(true, "After saving the changes, record_1 sould not have the remote data"); + + deferredResult.addMethod(user, 'getRecord', record_2); + deferredResult.addMethodcaller('hasLoadedRemoteData'); + deferredResult.addTest(false, "After saving, record_2 should still be NOT loaded"); + + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addNewRecordFieldAndSave_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 3, "The record has initially 3 fields"); + }); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('addField', {'label':"New field label", 'value':"New field value", 'isHidden':false})); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "adding a field should mark the record as having pending changes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The record has now 4 fields"); + }); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 4"); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(true, "after saving changes, hasAnyCleanTextData should be true"); + +//deferredResult.addCallback(function (aValue) { console.log(">>> #################################################"); return aValue}); + deferredResult.addMethod(user, 'deleteAllCleanTextData'); +//deferredResult.addCallback(function (aValue) { console.log("<<< #################################################"); return aValue}); + + deferredResult.addMethod(user, 'hasAnyCleanTextData'); + deferredResult.addTest(false, "after deleting all clean text, hasAnyCleanTextData should be false"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'deleteRecordFieldAndSave_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 3, "The record has initially 3 fields"); + }); + + deferredResult.collectResults({ + 'record': MochiKit.Base.method(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'), + 'field': [ + MochiKit.Base.method(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'), + MochiKit.Base.methodcaller('fields'), + MochiKit.Base.values, + MochiKit.Base.itemgetter('0') + ] + }) + deferredResult.addCallback(function (someValues) { + someValues['record'].removeField(someValues['field']); + }); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "removing a field should mark the record as having pending changes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 2, "The record has now 2 fields"); + }); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 5"); + + //. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 2, "Once saved, the record is left with just two fields"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'loadDirectLogin_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("loadDirectLogin_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('directLogins')); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(1, MochiKit.Base.keys(someDirectLogins).length, "the Amazon.com card has just one direct login"); + }); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(false, "initially the record does not have any pending changes"); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('directLogins')); + deferredResult.addCallback(MochiKit.Base.itemgetter('03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c')); +// deferredResult.addCallback(MochiKit.Base.methodcaller('runDirectLogin', true)); + deferredResult.addCallback(Clipperz.PM.UI.Common.Controllers.DirectLoginRunner.testDirectLogin); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('getFieldsValues')); + deferredResult.addCallback(function (someFieldsValues) { + SimpleTest.is(MochiKit.Base.keys(someFieldsValues).length, 2, "the Amazon.com card has just two fields"); + }); + + deferredResult.addMethod(user, 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); + deferredResult.addCallback(MochiKit.Base.methodcaller('hasPendingChanges')); + deferredResult.addTest(false, "accessing fields values should not trigger the 'hasPendingChanges' flag"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'readingVeryOldCards_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("readingVeryOldCards_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('label'); + deferredResult.addTest('Card encoded with an old algorithm', 'the label of the selected record is the expected one'); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(6, MochiKit.Base.keys(someFields).length, "the 'Card encoded with an old algorithm' card has six fields"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "accessing the card fields should not trigger the hasPendingChanges flag"); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addCallback(MochiKit.Base.methodcaller('addField', {'label':"New field label", 'value':"New field value", 'isHidden':false})); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addCallback(MochiKit.Base.methodcaller('fields')); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(7, MochiKit.Base.keys(someFields).length, "adding a field shoult bring the total field count to 7"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "adding a field should mark the record as having pending changes - 2"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addingNewEmptyRecordAndSaveChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var newRecordReference; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("addingNewEmptyRecordAndSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); + }); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addMethodcaller('reference'); + deferredResult.addCallback(function (aNewRecordReference) { + newRecordReference = aNewRecordReference; + }) + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); + + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "Reloading the data, just one record is available, as a brand new record without any changes should not be saved"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addNewRecordAndSaveChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("addNewRecordAndSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); + }); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addNewRecordAndSaveChanges_test ", {trace:false}); + + innerDeferredResult.addMethod(aNewRecord, 'label'); + innerDeferredResult.addTest('', "The label of a brand new record should be the empty string"); + + innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record label"); + innerDeferredResult.addMethod(aNewRecord, 'setNotes', "New record notes"); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 1", 'value':"Value 1", 'isHidden':false}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 2", 'value':"Value 2", 'isHidden':false}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 3", 'value':"Value 3", 'isHidden':true}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"Label 4", 'value':"Value 4", 'isHidden':false}); + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); + + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addCallback(function () { + var recordData + var recordVersionData; + + recordData = MochiKit.Base.values(proxy.dataStore().data()['users']['9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8']['records'])[1]; + recordVersionData = MochiKit.Base.values(recordData['versions'])[0]; + + SimpleTest.is(recordVersionData['previousVersionKey'], Clipperz.PM.Crypto.nullValue, "The previous version key on the first version of a newly created record is equal to Clipperz.PM.Crypto.nullValue"); + }); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(someRecords.length, 2, "Reloading the data, two records are available."); + return someRecords; + }); + deferredResult.addCallback(MochiKit.Base.itemgetter('1')); + deferredResult.collectResults({ + 'label': [ + MochiKit.Base.methodcaller('label'), + Clipperz.Async.Test.is("New record label", "The label is correct") + ], + 'notes': [ + MochiKit.Base.methodcaller('notes'), + Clipperz.Async.Test.is("New record notes", "The note is correct") + ], + 'fields': [ + MochiKit.Base.methodcaller('fields'), + function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The fields are 4, as expected"); + return someFields; + } + ] + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addNewRecordAndTestNewRecordIndex_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("addNewRecordAndTestNewRecordIndex_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 20, "The user has initially 20 records"); + }); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addNewRecordAndTestNewRecordIndex_test ", {trace:false}); + + innerDeferredResult.addMethod(user, 'getHeaderIndex', 'recordsIndex'); + innerDeferredResult.addMethodcaller('recordsIndex'); + innerDeferredResult.addCallback(MochiKit.Base.itemgetter(aNewRecord.reference())); + innerDeferredResult.addTest(20, "The index of the new record should be 20"); + + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'editRecordAndTestForChangesInPreferencesAndOTP_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user_2; + var originalPreferences; + var originalOTPs; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user_2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("editRecordAndTestForChangesInPreferencesAndOTP_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + deferredResult.addMethod(user, 'login'); + deferredResult.addMethod(user, 'getServerData'); + + deferredResult.collectResults({ + 'preferences': [ + MochiKit.Base.method(user, 'getHeaderIndex', 'preferences'), + MochiKit.Base.methodcaller('getDecryptedData') + ], + 'oneTimePasswords': [ + MochiKit.Base.method(user, 'getHeaderIndex', 'oneTimePasswords'), + MochiKit.Base.methodcaller('getDecryptedData') + ] + }); + + deferredResult.addCallback(function (someValues) { +//console.log("SOME VALUES", someValues); + originalPreferences = Clipperz.Base.deepClone(someValues['preferences']); + originalOTPs = Clipperz.Base.deepClone(someValues['oneTimePasswords']); + + SimpleTest.is(originalPreferences['preferredLanguage'], 'en-US', "Preference.language is ok"); + SimpleTest.is(originalPreferences['shouldShowDonationPanel'], false, "Preference.shouldShowDonationPanel is ok"); + + SimpleTest.is(MochiKit.Base.keys(originalOTPs).length, 6, "the number of OTPs is as expected"); + }); + + deferredResult.addMethod(user, 'getRecord', '35b30f9e923ce913365815d44cf344ce66cb71b636093b8ec55b8245d13df82b'); + deferredResult.addCallback(MochiKit.Base.methodcaller('setLabel', "NEW LABEL")); + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user_2, 'login'); + deferredResult.addMethod(user_2, 'getServerData'); + + deferredResult.collectResults({ + 'preferences': [ + MochiKit.Base.method(user_2, 'getHeaderIndex', 'preferences'), + MochiKit.Base.methodcaller('getDecryptedData') + ], + 'oneTimePasswords': [ + MochiKit.Base.method(user_2, 'getHeaderIndex', 'oneTimePasswords'), + MochiKit.Base.methodcaller('getDecryptedData') + ] + }); + + deferredResult.addCallback(function (someValues) { +//console.log("SOME VALUES", someValues); +// originalPreferences = Clipperz.Base.deepClone(someValues['preferences']); +// originalOTPs = Clipperz.Base.deepClone(someValues['oneTimePasswords']); + + SimpleTest.is(someValues['preferences']['preferredLanguage'], originalPreferences['preferredLanguage'], "Preference.language is preserved"); + SimpleTest.is(someValues['preferences']['shouldShowDonationPanel'], originalPreferences['shouldShowDonationPanel'], "Preference.shouldShowDonationPanel is preserved"); + + SimpleTest.is(MochiKit.Base.keys(someValues['oneTimePasswords']).length, MochiKit.Base.keys(originalOTPs).length, "the number of OTPs is preserved"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addRecordAndSaveChangesMultipleTimes_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(1, "The user has one record stored in its account"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "After loading records, the user should have no pending changes"); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test ", {trace:false}); + + innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 1"); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'record number', 'value':"1", 'isHidden':false}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'field count', 'value':"2", 'isHidden':false}); + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "Before saving, the user has pending changes"); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addCallback(SimpleTest.ok, true, "Saving worked (apparently) fine"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "After saving, the user has no pending changes"); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test ", {trace:false}); + + innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 2"); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':"record number", 'value':"2", 'isHidden':false}); + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + deferredResult.addMethod(user, 'saveChanges'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "After having created two new records, the total should be updated accordingly"); + + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(3, "Reloading the data, three records are available"); + + deferredResult.addMethod(user2, 'recordWithLabel', 'New record 1'); +//deferredResult.addCallback(function (aValue) { console.log("RECORD with Label", aValue); return aValue; }); + deferredResult.collectResults({ + 'label': [ + MochiKit.Base.methodcaller('label'), + MochiKit.Base.partial(Clipperz.Async.Test.is, 'New record label', "The label is correct") + ], + 'notes': [ + MochiKit.Base.methodcaller('notes'), + Clipperz.Async.Test.is('', "The note of the new created record is empty") + ], + 'fields': [ + MochiKit.Base.methodcaller('fields'), + MochiKit.Base.values, + MochiKit.Base.itemgetter('length'), + Clipperz.Async.Test.is(2, "The new record has just one field, as expected") + ], + 'fieldValues_1': [ + MochiKit.Base.methodcaller('fieldWithLabel', 'record number'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is('1', "The field value is as expected") + ], + 'fieldValues_2': [ + MochiKit.Base.methodcaller('fieldWithLabel', 'field count'), + MochiKit.Base.methodcaller('value'), + Clipperz.Async.Test.is('2', "Also the second field value is as expected") + ] + }) + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'addNewRecordAndRevertChanges_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + user2 = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("addNewRecordAndRevertChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_someExtraOldData']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 1, "The user has initially just one record"); + }); + + deferredResult.addMethod(user, 'createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + return Clipperz.Async.callbacks("addNewRecordAndRevertChanges_test ", [ + MochiKit.Base.method(aNewRecord, 'setLabel', "New record label"), + MochiKit.Base.method(aNewRecord, 'setNotes', "New record notes"), + MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 1", 'value':"Value 1", 'isHidden':false}), + MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 2", 'value':"Value 2", 'isHidden':false}), + MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 3", 'value':"Value 3", 'isHidden':true}), + MochiKit.Base.method(aNewRecord, 'addField', {'label':"Label 4", 'value':"Value 4", 'isHidden':false}) + ], {trace:false}); + }) + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 2, "After having created a new record, the total should be updated accordingly"); + }); + + deferredResult.addMethod(user, 'getRecord', '05aad20ee399b11ddc923e601fcd1d096233634f2ad4c55db4f6435e5f9cc17a'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(false, "adding a new record should not trigger any changes on a sibling record"); + + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(true, "adding a new record should trigger the 'has pending changes' flag on the user"); + + deferredResult.addMethod(user, 'revertChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "reverting changes shoud restore the previous state on the user"); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(someRecords.length, 1, "Reloading the data, just one record is available."); + return someRecords; + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'logout_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + deferredResult = new Clipperz.Async.Deferred("logout_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 18, "The user has 18 records"); + }); + + deferredResult.addMethod(user, 'logout'); + deferredResult.shouldSucceed("Logging out should not trigger an exception"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'lock_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var returnPassword = function () { return MochiKit.Async.succeed('clipperz'); }; + var failPassword = function () { throw "Unexpected access to the password"; }; + var currentPasswordFunction = returnPassword; + var passwordFunction = function () { return currentPasswordFunction(); }; + + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:passwordFunction}); + + deferredResult = new Clipperz.Async.Deferred("lock_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 18, "The user has 18 records"); + }); + + deferredResult.addMethod(user, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 22, "The user has 22 direct logins"); + }); + + deferredResult.addMethod(proxy, 'shouldNotReceiveAnyFurtherRequest'); + deferredResult.addCallback(function () { currentPasswordFunction = failPassword; }); + + deferredResult.addMethod(user, 'lock'); + deferredResult.shouldSucceed("Locking out should not trigger an exception"); + + deferredResult.addMethod(proxy, 'unexpectedRequests'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(0, "The proxy should have not received any extra request"); +//deferredResult.addCallback(function (aValue) { console.log("PROXY.unexpectedRequests", Clipperz.Base.serializeJSON(proxy.unexpectedRequests())); return aValue; }); + deferredResult.addMethod(proxy, 'mayReceiveMoreRequests'); + deferredResult.addCallback(function () { currentPasswordFunction = returnPassword; }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'registerNewUser_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var username; + var passphrase; + + username = "new"; + passphrase = "user"; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); +// user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return MochiKit.Async.succeed(passphrase);}}); + user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("registerNewUser_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + + deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, username, function () { return MochiKit.Async.succeed(passphrase);}); + deferredResult.setValue('user'); + + deferredResult.addMethodcaller('getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 0, "The newly created user has no records"); + }); + deferredResult.getValue('user'); + deferredResult.addMethodcaller('logout'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getDirectLogins'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 0, "The user has no direct logins"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'registerNewUserAndAddARecord_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user, user2; + var username; + var passphrase; + + username = "new"; + passphrase = "user"; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user2 = new Clipperz.PM.DataModel.User({username:username, getPassphraseFunction:function () { return passphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("registerNewUserAndAddARecord_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_with_preferences_and_OTPs_data']); + + deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount, username, function () { return MochiKit.Async.succeed(passphrase);}); + deferredResult.setValue('user'); + + deferredResult.addMethodcaller('getRecords'); + deferredResult.addCallback(function (someRecords) { + SimpleTest.is(MochiKit.Base.keys(someRecords).length, 0, "The newly created user has no records"); + }); + + deferredResult.getValue('user'); + deferredResult.addMethodcaller('createNewRecord'); + deferredResult.addCallback(function (aNewRecord) { + var innerDeferredResult; + + innerDeferredResult = new Clipperz.Async.Deferred("addRecordAndSaveChangesMultipleTimes_test ", {trace:false}); + + innerDeferredResult.addMethod(aNewRecord, 'setLabel', "New record 1"); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'record number', 'value':"1", 'isHidden':false}); + innerDeferredResult.addMethod(aNewRecord, 'addField', {'label':'field count', 'value':"2", 'isHidden':false}); + innerDeferredResult.callback(); + + return innerDeferredResult; + }) + + deferredResult.getValue('user'); + deferredResult.addMethodcaller('saveChanges'); + deferredResult.addCallback(SimpleTest.ok, true, "Saving worked (apparently) fine"); + + + deferredResult.getValue('user'); + deferredResult.addMethodcaller('logout'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(function (someDirectLogins) { + SimpleTest.is(MochiKit.Base.keys(someDirectLogins).length, 1, "The user - even after a brand new login - has the newly created record"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'changePassphrase_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + var user2; + var newPassphrase; + + newPassphrase = 'zreppilc'; + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + user2 = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return newPassphrase;}}); + + deferredResult = new Clipperz.Async.Deferred("changePassphrase_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(20, "This account has oly a single card"); + + deferredResult.addMethod(user, 'changePassphrase', newPassphrase); + deferredResult.addMethod(user, 'logout'); + + deferredResult.addMethod(user2, 'login'); + deferredResult.addMethod(user2, 'getRecords'); + deferredResult.addCallback(MochiKit.Base.itemgetter('length')); + deferredResult.addTest(20, "This account has oly a single card"); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- +/* + 'rearrangeRecordFieldOrderAndSave_test': function (someTestArgs) { + var deferredResult; + var proxy; + var user; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + deferredResult = new Clipperz.Async.Deferred("simpleSaveChanges_test", someTestArgs); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(user, 'login'); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + var fields; + + fields = MochiKit.Base.values(someFields); + SimpleTest.is(fields.length, 3, "The record has initially 3 fields"); + SimpleTest.is(fields[0].reference(), '6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b', "the first field is the expected one"); + SimpleTest.is(fields[1].reference(), 'fde88847cdbae6f7ee7e38aca1a242492888ff430a79c997bc6ba4afd0540ca2', "the second field is the expected one"); + SimpleTest.is(fields[2].reference(), 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410', "the third field is the expected one"); + }); + +// "6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b": { +// "label":"Label 1","value":"Value 1","type":"TXT","hidden":false +// }, +// "fde88847cdbae6f7ee7e38aca1a242492888ff430a79c997bc6ba4afd0540ca2": { +// "label":"Label 2","value":"Value 2","type":"PWD","hidden":true +// }, +// "bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410": { +// "label":"Label 3","value":"http://www.example.com","type":"URL","hidden":false +// } + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.methodcaller('sortFieldReference', [ + 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410', + '6a84c414866dd6d266186f0255a595e9330fb34973c085a81a6e4906876c721b', + 'bd4e3bb9d3497f63c4c3a507d4b80f489fdb57deb9d1b342a5e1cff65936a410' + ])); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('hasPendingChanges'); + deferredResult.addTest(true, "adding a field should mark the record as having pending changes"); + + deferredResult.addMethod(user, 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethodcaller('fields'); + deferredResult.addCallback(function (someFields) { + SimpleTest.is(MochiKit.Base.values(someFields).length, 4, "The record has now 4 fields"); + }); + + deferredResult.addMethod(user, 'saveChanges'); + deferredResult.addMethod(user, 'hasPendingChanges'); + deferredResult.addTest(false, "saving changes should return the user to a state with not changes pending - 4"); + + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.DataModel.User", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html new file mode 100644 index 0000000..d762093 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/DataModel/index.html @@ -0,0 +1,47 @@ + + + + + Clipperz.PM.DataModel.* - tests + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.html b/frontend/gamma/tests/tests/Clipperz/PM/Date.html new file mode 100644 index 0000000..106774b --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.html @@ -0,0 +1,59 @@ + + + + + Clipperz.PM.Date - test + + + + + + + + + + + + + + + + + + + + + + +
+	
+
+ + + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js new file mode 100644 index 0000000..df271f1 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Date.test.js @@ -0,0 +1,90 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +var tests = { + + //------------------------------------------------------------------------- + + 'offlineDataParsing_test': function () { + var value; + var parsedValue; + var expectedValue; + + value = 'Tue Mar 27 06:41:37 PDT 2007'; + parsedValue = Clipperz.PM.Date.parse(value); + expectedValue = new Date(); + expectedValue.setUTCFullYear(2007, 03 - 1, 27); + expectedValue.setUTCHours(13, 41, 37); +// SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [1]"); + SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [1]"); + + value = 'Thu May 10 15:01:21 PDT 2007'; + parsedValue = Clipperz.PM.Date.parse(value); + expectedValue = new Date(); + expectedValue.setUTCFullYear(2007, 05 - 1, 10); + expectedValue.setUTCHours(22, 01, 21); +// SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 00:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]"); + SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]"); + + value = 'Thu May 10 15:01:21 PST 2007'; + parsedValue = Clipperz.PM.Date.parse(value); + expectedValue = new Date(); + expectedValue.setUTCFullYear(2007, 05 - 1, 10); + expectedValue.setUTCHours(23, 01, 21); +// SimpleTest.is(parsedValue.toString(), 'Fri May 11 2007 01:01:21 GMT+0200 (CEST)', "the data in the format stored in the offline copy is processed correctly [3]"); + SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format stored in the offline copy is processed correctly [3]"); + }, + + //------------------------------------------------------------------------- + + 'onlineDataParsing_test': function () { + var value; + var parsedValue; + var expectedValue; + + value = 'Tue, 27 March 2007 06:41:37 PDT'; + parsedValue = Clipperz.PM.Date.parse(value); + expectedValue = new Date(); + expectedValue.setUTCFullYear(2007, 03 - 1, 27); + expectedValue.setUTCHours(13, 41, 37); + +// SimpleTest.is(parsedValue.toString(), 'Tue Mar 27 2007 15:41:37 GMT+0200 (CEST)', "the data in the format returned by the server is processed correctly"); + SimpleTest.is(parsedValue.toString(), expectedValue.toString(), "the data in the format returned by the server is processed correctly"); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +Clipperz.PM.Strings.Languages.initSetup(); +SimpleTest.runDeferredTests("Clipperz.PM.Date", tests, {trace:false}); + + + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html new file mode 100644 index 0000000..573dac8 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.html @@ -0,0 +1,65 @@ + + + + + Clipperz.PM.Proxy - TEST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+	
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js new file mode 100644 index 0000000..8a16a5b --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Proxy.test.js @@ -0,0 +1,117 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- + + 'simple_tests': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var proxy; + + proxy = new Clipperz.PM.Proxy(); + ok(proxy != null, "can create instances of the Proxy class"); + is(proxy.shouldPayTolls(), false, "proxy is set to NOT pay tolls by default"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + + 'simpleTestsWithTolls_tests': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var proxy; + + proxy = new Clipperz.PM.Proxy({shouldPayTolls:true}); + is(proxy.shouldPayTolls(), true, "I can set Proxy to pays tolls"); + }); + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +runTests = function(aClassName) { + try { + var deferredTests; + var aTestName; + + deferredTests = new Clipperz.Async.Deferred(aClassName + ".test", {trace:false}); + + aTestName = window.location.href.match(/#.*/); + if (aTestName && (aTestName != '#')) { + aTestName = aTestName[0].slice(1); + if (aTestName in tests) { + //Clipperz.log("single test execution, via fragment identifier", aTestName); + deferredTests.addCallback(tests[aTestName]); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } else { + deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); + } + } else { + for (aTestName in tests) { + deferredTests.addCallback(tests[aTestName]); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } + deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); + } + deferredTests.addBoth(SimpleTest.finish); + deferredTests.callback(); + + SimpleTest.waitForExplicitFinish(); + } catch (err) { + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); + } +}("Clipperz.PM.Proxy"); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.html b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html new file mode 100644 index 0000000..7937380 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.html @@ -0,0 +1,62 @@ + + + + + Clipperz.PM.Toll - test + + + + + + + + + + + + + + + + + + + + + + + + + +
+	
+
+ + + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js new file mode 100644 index 0000000..b54996f --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/Toll.test.js @@ -0,0 +1,202 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + //------------------------------------------------------------------------- +/* + 'simple_test': function() { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("simple_tests", {trace:false}); + deferredResult.addCallback(function() { + var tollTargetValue; + var toll; + var price; + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + tollTargetValue = Clipperz.Crypto.SHA.sha256(tollTargetValue); + + price = 1; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + + price = 5; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + + price = 6; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + + price = 7; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + + price = 7; + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32); + toll = new Clipperz.PM.Toll({targetValue:tollTargetValue.toHexString(), cost:price}); + toll.pay(); + }); + + deferredResult.callback(); + + return deferredResult; + }, +*/ + //------------------------------------------------------------------------- + + 'deferredPay_test': function() { + var deferredResult; + var tollTargetValue; + var toll_1, toll_5, toll_6, toll_7, toll_10, toll_16; + +// tollTargetValue = Clipperz.Crypto.SHA.sha256(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32)); + + + + deferredResult = new Clipperz.Async.Deferred("deferredPay_tests", {trace:false}); + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_1 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:1}); + + deferredResult.addMethod(toll_1, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 1), "Payed a toll of cost 1"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_5 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:5}); + + deferredResult.addMethod(toll_5, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 5), "Payed a toll of cost 5"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_6 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:6}); + + deferredResult.addMethod(toll_6, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 6), "Payed a toll of cost 6"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_7 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:7}); + + deferredResult.addMethod(toll_7, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 7), "Payed a toll of cost 7"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + + + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_10 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:10}); + + deferredResult.addMethod(toll_10, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 10), "Payed a toll of cost 10"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); + +/* + tollTargetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); + toll_16 = new Clipperz.PM.Toll({targetValue:tollTargetValue, cost:16}); + + deferredResult.addMethod(toll_16, 'deferredPay'); + deferredResult.addCallback(function (aResult) { + SimpleTest.ok(Clipperz.PM.Toll.validate(aResult.targetValue, aResult.toll, 16), "Payed a toll of cost 16"); + }); + deferredResult.addCallback(MochiKit.Async.wait, 1); +*/ + + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + +//############################################################################# + +runTests = function() { + try { + var deferredTests; + var aTestName; + + deferredTests = new Clipperz.Async.Deferred("Clipperz.PM.Toll.test", {trace:false}); + + aTestName = window.location.href.match(/#.*/); + if (aTestName && (aTestName != '#')) { + aTestName = aTestName[0].slice(1); + if (aTestName in tests) { + //Clipperz.log("single test execution, via fragment identifier", aTestName); + deferredTests.addCallback(tests[aTestName]); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } else { + deferredTests.addBoth(is, aTestName, null, "Wrong test name selected to run"); + } + } else { + for (aTestName in tests) { + deferredTests.addCallback(tests[aTestName]); + deferredTests.addErrback(SimpleTest.ok, false, aTestName); + } + deferredTests.addBoth(is, true, true, "FINISH: completed the full stack of tests"); + } + deferredTests.addBoth(SimpleTest.finish); + deferredTests.callback(); + + SimpleTest.waitForExplicitFinish(); + } catch (err) { + var s = "test suite failure!\n"; + var o = {}; + var k = null; + for (k in err) { + // ensure unique keys?! + if (!o[k]) { + s += k + ": " + err[k] + "\n"; + o[k] = err[k]; + } + } + ok ( false, s ); + } +}(); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html new file mode 100644 index 0000000..6fbdcd6 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.html @@ -0,0 +1,64 @@ + + + + + Clipperz.PM.UI.Web.MainController - test + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+	
+
+ + + diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js new file mode 100644 index 0000000..3953558 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/MainController.test.js @@ -0,0 +1,90 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +//Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var tests = { + + 'isPassphraseDelegateLockSetAfterInit': function (someTestArgs) { + return Clipperz.Async.callbacks('isPassphraseDelegateLockSetAfterInit', [ + function () { + var mainController; + + mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); + SimpleTest.is(true, mainController._passphraseDelegateLock.locked, 'passphraseDelegate lock is locked after MainController initialization') + }]); + }, + + //------------------------------------------------------------------------- + + 'getPassphraseWithUnsetDelegate_test': function (someTestArgs) { + var deferredResult; + var mainController; + var delegateFunction; + + mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); + delegateFunction = function () { return "clipperz";}; + + MochiKit.Async.callLater(1, MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction)); + + return Clipperz.Async.callbacks("MainController.getPassphraseWithUnsetDelegate",[ + MochiKit.Base.method(mainController, 'getPassphrase'), + function (aResult) { + SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct"); + } + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + + 'getPassphraseWithSetDelegate_test': function (someTestArgs) { + var deferredResult; + var mainController; + var delegateFunction; + + mainController = new Clipperz.PM.UI.Web.Controllers.MainController(); + delegateFunction = function () {return "clipperz";}; + + return Clipperz.Async.callbacks("MainController.getPassphraseWithSetDelegate_test",[ + MochiKit.Base.method(mainController, 'setPassphraseDelegate', delegateFunction), + MochiKit.Base.method(mainController, 'getPassphrase'), + function (aResult) { + SimpleTest.is(aResult, 'clipperz', "the password provided by the delegate is correct"); + } + ], {trace:false}); + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.PM.UI.Web.Controllers.MainController", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html new file mode 100644 index 0000000..f3283b6 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/Controllers/index.html @@ -0,0 +1,46 @@ + + + + + Clipperz.PM.UI.Web.Controllers.* - tests + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html new file mode 100644 index 0000000..9afa73d --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/Web/index.html @@ -0,0 +1,45 @@ + + + + + Clipperz.PM.UI.Web* - tests + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html new file mode 100644 index 0000000..867362b --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/UI/index.html @@ -0,0 +1,45 @@ + + + + + Clipperz.PM.UI.* - tests + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/PM/index.html b/frontend/gamma/tests/tests/Clipperz/PM/index.html new file mode 100644 index 0000000..acc45f7 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/PM/index.html @@ -0,0 +1,56 @@ + + + + + Clipperz.PM.* - tests + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html new file mode 100644 index 0000000..7fe9a84 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/RoboFormExportProcessor.html @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + diff --git a/frontend/gamma/tests/tests/Clipperz/Set.html b/frontend/gamma/tests/tests/Clipperz/Set.html new file mode 100644 index 0000000..e5814bc --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Set.html @@ -0,0 +1,54 @@ + + + + + Clipperz.Set - test + + + + + + + + + + + + + + + + + +
+
+
+ + + diff --git a/frontend/gamma/tests/tests/Clipperz/Set.test.js b/frontend/gamma/tests/tests/Clipperz/Set.test.js new file mode 100644 index 0000000..8122b07 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/Set.test.js @@ -0,0 +1,165 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +var tests = { + + //------------------------------------------------------------------------- + + 'set_test': function (someTestArgs) { + var deferredResult; + + deferredResult = new Clipperz.Async.Deferred("set_test", someTestArgs); + deferredResult.addCallback(function () { + var set; + var object1; + var object2; + var object3; + + set = new Clipperz.Set(); + + object1 = new Object(); + object2 = new Object(); + object3 = new Object(); + + object1.label = "object 1"; + object2.label = "object 2"; + object3.label = "object 3"; + + is(set.size(), 0, "A new set should be empty"); + + set.add(object1); + is(set.size(), 1); + is(set.contains(object1), true); + is(set.contains(object2), false); + + set.add(object1); + is(set.size(), 1, "Adding the same object twice does not change the set content"); + is(set.contains(object1), true); + is(set.contains(object2), false); + + set.add(object2); + is(set.size(), 2); + is(set.contains(object1), true); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.remove(object1); + is(set.size(), 1, "Size check after removing an object"); + is(set.contains(object1), false); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.remove(object1); + is(set.size(), 1, "Removing twice the same object does not change the set content"); + is(set.contains(object1), false); + is(set.contains(object2), true); + is(set.contains(object3), false); + + set.empty(); + is(set.size(), 0); + + { + var items; + var populatedSet; + + items = ["item1", "item2", "item3"]; + + populatedSet = new Clipperz.Set({'items': items}); + is(populatedSet.size(), 3); + is(populatedSet.contains("item1"), true); + is(populatedSet.contains("item4"), false); + + items.splice(0, items.length); + is(populatedSet.size(), 3); + } + + { + var items; + var deletedItems; + + items = ["item1", "item2", "item3"]; + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1"]; + set.remove(deletedItems); + is(set.size(), 2, "here I am"); + is(set.contains("item1"), false); + is(set.contains("item2"), true); + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1", "item2"]; + set.remove(deletedItems); + is(set.size(), 1); + is(set.contains("item1"), false); + is(set.contains("item2"), false); + + set = new Clipperz.Set({'items': items}); + deletedItems = ["item1", "item4"]; + set.remove(deletedItems); + is(set.size(), 2); + is(set.contains("item1"), false); + is(set.contains("item2"), true); + } + + { + var items; + var poppedItem; + + items = ["item1", "item2", "item3"]; + set = new Clipperz.Set({'items': items}); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 1"); + is(set.size(), 2, "test popAnItem - 2"); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 3"); + is(set.size(), 1, "test popAnItem - 4"); + + poppedItem = set.popAnItem(); + ok(poppedItem != null, "test popAnItem - 5"); + is(set.size(), 0, "test popAnItem - 6"); + + poppedItem = set.popAnItem(); + ok(poppedItem == null, "test popAnItem - 7"); + } + }); + deferredResult.callback(); + + return deferredResult; + }, + + //------------------------------------------------------------------------- + 'syntaxFix': MochiKit.Base.noop +}; + + + +//############################################################################# + +SimpleTest.runDeferredTests("Clipperz.Set", tests, {trace:false}); diff --git a/frontend/gamma/tests/tests/Clipperz/index.html b/frontend/gamma/tests/tests/Clipperz/index.html new file mode 100644 index 0000000..b4c4992 --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/index.html @@ -0,0 +1,49 @@ + + + + + Clipperz.* - tests + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/index_googleCode.html b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html new file mode 100644 index 0000000..6e3249c --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/index_googleCode.html @@ -0,0 +1,50 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Clipperz/index_testECC.html b/frontend/gamma/tests/tests/Clipperz/index_testECC.html new file mode 100644 index 0000000..46572ab --- /dev/null +++ b/frontend/gamma/tests/tests/Clipperz/index_testECC.html @@ -0,0 +1,50 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js new file mode 100644 index 0000000..21b6af6 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/CardDialogEditing_test.js @@ -0,0 +1,238 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.CardDialogEditing'); + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Clipperz.PM.Strings.Languages.initSetup(); + +Clipperz.Tests.CardDialogEditing.Tester = function(args) { + args = args || {}; + + Clipperz.Tests.CardDialogEditing.Tester.superclass.constructor.call(this, args); +//# this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + return this; +}; + +Clipperz.Base.extend(Clipperz.Tests.CardDialogEditing.Tester, Object, { + + 'toString': function() { + return "Clipperz.Tests.CardDialogEditing.Tester"; + }, + + //------------------------------------------------------------------------- + + 'user': function () { + return this._user; + }, + + //------------------------------------------------------------------------- + + 'run': function () { + var deferredResult; + var proxy; + var cardDialogController; + var cardDialogComponent; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + + deferredResult = new Clipperz.Async.Deferred("CardDialogEditing_test.init", {trace:false}); +//# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data_newVersion']); + deferredResult.addMethod(this.user(), 'login'); +//# deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + +// deferredResult.addMethod(this.user(), 'getRecord', '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80'); // Linkedin +// deferredResult.addMethod(this.user(), 'getRecord', '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d'); // Example Attack + deferredResult.addMethod(this.user(), 'getRecord', '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551'); // Amazon +// deferredResult.addMethod(this.user(), 'getRecord', '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a'); // MyBlogLog +// deferredResult.addMethod(this.user(), 'getRecord', '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728'); // Del.icio.us +// deferredResult.addMethod(this.user(), 'getRecord', '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a'); // Microsoft Office Key +// deferredResult.addMethod(this.user(), 'getRecord', '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18'); // The NewYork Times +// deferredResult.addMethod(this.user(), 'getRecord', '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb'); // Web Password +// deferredResult.addMethod(this.user(), 'getRecord', '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39'); // Jaiku +// deferredResult.addMethod(this.user(), 'getRecord', '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291'); // Home Burglar Alarm +// deferredResult.addMethod(this.user(), 'getRecord', 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c'); // MySpace +// deferredResult.addMethod(this.user(), 'getRecord', 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045'); // American Airlines +// deferredResult.addMethod(this.user(), 'getRecord', 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4'); // Luftansa +// deferredResult.addMethod(this.user(), 'getRecord', 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5'); // Google Account +// deferredResult.addMethod(this.user(), 'getRecord', 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732'); // Expedia +// deferredResult.addMethod(this.user(), 'getRecord', 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6'); // Bloglines + +// deferredResult.addMethod(this.user(), 'getRecord', '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4'); // WEB PASSWORD (0) +// deferredResult.addMethod(this.user(), 'getRecord', '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113'); // DIGG (1) +// deferredResult.addMethod(this.user(), 'getRecord', 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065'); // SAP (2) +// deferredResult.addMethod(this.user(), 'getRecord', 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d'); // YAHOO (4) + +// deferredResult.addMethod(this.user(), 'createNewRecord'); + +/* + deferredResult.addCallback(function (aRecord) { + return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record", [ + MochiKit.Base.method(aRecord, 'setLabel', "Clipperz staging site"), + MochiKit.Base.method(aRecord, 'addField', {'label':"URL", 'value':"http://d6.clipperz.com", 'isHidden':false}), + MochiKit.Base.method(aRecord, 'addField', {'label':"USERNAME", 'value':"staging", 'isHidden':false}), + MochiKit.Base.method(aRecord, 'addField', {'label':"PASSWORD", 'value':"drupal", 'isHidden':true}), + + MochiKit.Base.method(aRecord, 'createNewDirectLogin'), + function (aDirectLogin) { + return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup new record [directLogin]", [ + MochiKit.Base.method(aDirectLogin, 'setLabel', 'Clipperz staging site'), + MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.apple.com/favicon.ico'), + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{ "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"}'), + + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'url', 'URL'), + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'username', 'USERNAME'), + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'PASSWORD') + ], {trace:false}); + }, + MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) + ], {trace:false}); + }); + +// deferredResult.addMethod(this.user(), 'createNewRecord'); + deferredResult.addCallback(function (aRecord) { + return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup another record", [ + MochiKit.Base.method(aRecord, 'setLabel', "Twitter site"), + MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_url", 'value':"http://www.twitter.com", 'isHidden':false}), + MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_username", 'value':"staging", 'isHidden':false}), + MochiKit.Base.method(aRecord, 'addField', {'label':"twitter_password", 'value':"drupal", 'isHidden':true}), + + MochiKit.Base.method(aRecord, 'createNewDirectLogin'), + function (aDirectLogin) { + return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup another record [directLogin]", [ + MochiKit.Base.method(aDirectLogin, 'setLabel', 'Twitter'), + MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.twitter.com/favicon.ico'), + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{"page": {"title": "Twitter"},\n"form": {"attributes": {"action": "https://twitter.com/sessions",\n"method": "post"},\n"inputs": [{"type": "hidden",\n"name": "authenticity_token",\n"value": "b78a9460629980ed4c705fe94e6c4f37bfc32fed"},\n{"type": "text",\n"name": "session[username_or_email]",\n"value": ""},\n{"type": "password",\n"name": "session[password]",\n"value": ""},\n{"type": "checkbox",\n"name": "remember_me",\n"value": "1"},\n{"type": "hidden",\n"name": "q",\n"value": ""}]},\n"version": "0.2.3"}'), + + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'session[username_or_email]', 'twitter_username'), + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'session[password]', 'twitter_password'), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('remember_me'), + MochiKit.Base.methodcaller('setValue', 1) + + ], {trace:false}); + }, + MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) + ], {trace:false}); + }); + +// deferredResult.addMethod(this.user(), 'createNewRecord'); + deferredResult.addCallback(function (aRecord) { + return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup third record", [ + MochiKit.Base.method(aRecord, 'setLabel', "R@cine"), + MochiKit.Base.method(aRecord, 'addField', {'label':"R@cine_username", 'value':"joe", 'isHidden':false}), + MochiKit.Base.method(aRecord, 'addField', {'label':"R@cine_password", 'value':"clipperz", 'isHidden':true}), + + MochiKit.Base.method(aRecord, 'createNewDirectLogin'), + function (aDirectLogin) { + return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup third record [directLogin]", [ + MochiKit.Base.method(aDirectLogin, 'setLabel', 'R@cine'), + MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.racine.ra.it/horde/imp/graphics/favicon.ico'), + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{"page": {"title": "IMP :: Welcome to Horde"},\n"form": {"attributes": {"action": "http://www.racine.ra.it/horde/imp/redirect.php",\n"method": "post"},\n"inputs": [{"type": "hidden",\n"name": "actionID",\n"value": "105"},\n{"type": "hidden",\n"name": "url",\n"value": ""},\n{"type": "hidden",\n"name": "mailbox",\n"value": "INBOX"},\n{"type": "text",\n"name": "imapuser",\n"value": ""},\n{"type": "password",\n"name": "pass",\n"value": ""},\n{"type": "hidden",\n"name": "server",\n"value": "localhost"},\n{"type": "hidden",\n"name": "port",\n"value": "143"},\n{"type": "hidden",\n"name": "namespace",\n"value": ""},\n{"type": "hidden",\n"name": "maildomain",\n"value": "racine.ra.it"},\n{"type": "hidden",\n"name": "protocol",\n"value": "imap/notls"},\n{"type": "hidden",\n"name": "realm",\n"value": "racine.ra.it"},\n{"type": "hidden",\n"name": "folders",\n"value": "mail/"},\n{"type": "select",\n"name": "new_lang",\n"options": [{"selected": false,\n"label": "Bulgarian",\n"value": "bg_BG"},\n{"selected": false,\n"label": "Chinese (Simplified)",\n"value": "zh_CN"},\n{"selected": false,\n"label": "Chinese (Traditional)",\n"value": "zh_TW"},\n{"selected": false,\n"label": "Czech",\n"value": "cs_CZ"},\n{"selected": false,\n"label": "Dansk",\n"value": "da_DK"},\n{"selected": false,\n"label": "Deutsch",\n"value": "de_DE"},\n{"selected": false,\n"label": "English (GB)",\n"value": "en_GB"},\n{"selected": true,\n"label": "English (US)",\n"value": "en_US"},\n{"selected": false,\n"label": "Español",\n"value": "es_ES"},\n{"selected": false,\n"label": "Eesti",\n"value": "et_EE"},\n{"selected": false,\n"label": "Français",\n"value": "fr_FR"},\n{"selected": false,\n"label": "Greek",\n"value": "el_GR"},\n{"selected": false,\n"label": "Italiano",\n"value": "it_IT"},\n{"selected": false,\n"label": "Japanese",\n"value": "ja_JP"},\n{"selected": false,\n"label": "Korean",\n"value": "ko_KR"},\n{"selected": false,\n"label": "Latviešu",\n"value": "lv_LV"},\n{"selected": false,\n"label": "Lietuviskas",\n"value": "lt_LT"},\n{"selected": false,\n"label": "Magyar",\n"value": "hu_HU"},\n{"selected": false,\n"label": "Nederlands",\n"value": "nl_NL"},\n{"selected": false,\n"label": "Norsk bokmål",\n"value": "nb_NO"},\n{"selected": false,\n"label": "Norsk nynorsk",\n"value": "nn_NO"},\n{"selected": false,\n"label": "Polski",\n"value": "pl_PL"},\n{"selected": false,\n"label": "Português",\n"value": "pt_PT"},\n{"selected": false,\n"label": "Português Brasileiro",\n"value": "pt_BR"},\n{"selected": false,\n"label": "Romana",\n"value": "ro_RO"},\n{"selected": false,\n"label": "Russian (Windows)",\n"value": "ru_RU"},\n{"selected": false,\n"label": "Russian (KOI8-R)",\n"value": "ru_RU.KOI8-R"},\n{"selected": false,\n"label": "Slovak",\n"value": "sk_SK"},\n{"selected": false,\n"label": "Slovenscina",\n"value": "sl_SI"},\n{"selected": false,\n"label": "Suomi",\n"value": "fi_FI"},\n{"selected": false,\n"label": "Svenska",\n"value": "sv_SE"},\n{"selected": false,\n"label": "Ukranian",\n"value": "uk_UA"}]},\n{"type": "submit",\n"name": "button",\n"value": "Log in"}]},\n"version": "0.2.3"}'), + + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'imapuser', 'R@cine_username'), + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'pass', 'R@cine_password'), + + MochiKit.Base.method(aDirectLogin, 'formValues'), + MochiKit.Base.itemgetter('new_lang'), + MochiKit.Base.methodcaller('setValue', 'en_US') + + ], {trace:false}); + }, + MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) + ], {trace:false}); + }); +*/ + + deferredResult.addCallback(function (aRecord) { + return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup Kiva", [ + MochiKit.Base.method(aRecord, 'setLabel', "KIVA"), + MochiKit.Base.method(aRecord, 'addField', {'label':"kiva_email", 'value':"giulio.cesare@solaroli.it", 'isHidden':false}), + MochiKit.Base.method(aRecord, 'addField', {'label':"kiva_password", 'value':"G0ELE0ngyTZf", 'isHidden':true}), + + MochiKit.Base.method(aRecord, 'createNewDirectLogin'), + function (aDirectLogin) { + return Clipperz.Async.callbacks("CardDialogEditing_test.init - setup Kiva [directLogin]", [ + MochiKit.Base.method(aDirectLogin, 'setLabel', 'Kiva'), + MochiKit.Base.method(aDirectLogin, 'setFavicon', 'http://www.kiva.org/favicon.ico'), + MochiKit.Base.method(aDirectLogin, 'setBookmarkletConfiguration', '{\n "page": {\n "title": "kiva.org"\n },\n "form": {\n "attributes": {\n "action": "https://www.kiva.org/app.php?page=login&action=doLogin",\n "method": "post"\n },\n "inputs": [\n {\n "type": "text",\n "name": "email",\n "value": ""\n },\n {\n "type": "password",\n "name": "password",\n "value": ""\n },\n {\n "type": "submit",\n "name": "submit",\n "value": "Login >>"\n },\n {\n "type": "hidden",\n "name": "currURL",\n "value": "https://www.kiva.org/app.php?page=login"\n }\n ]\n },\n "version": "0.2.3"\n}'), + + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'email', 'kiva_email'), + MochiKit.Base.method(aDirectLogin, 'bindFormFieldWithLabelToRecordFieldWithLabel', 'password', 'kiva_password') + ], {trace:false}); + }, + MochiKit.Base.partial(MochiKit.Async.succeed, aRecord) + ], {trace:false}); + }); + + deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { + cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); + cardDialogController.run(); + }, this)); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'saveChanges': function () { + return this.user().saveChanges(); + }, + + //------------------------------------------------------------------------- + + 'hasPendingChanges': function () { + return this.user().hasPendingChanges(); + }, + + //------------------------------------------------------------------------- + + 'revertChanges': function () { + return this.user().revertChanges(); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + + + +init = function () { + var tester; + + tester = new Clipperz.Tests.CardDialogEditing.Tester(); + tester.run(); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js new file mode 100644 index 0000000..8065144 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/User.data.js @@ -0,0 +1,1881 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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: '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', + 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: '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', + 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' + } + } + } + } + } + } + }, + + //------------------------------------------------------------------------- + + 'joe_clipperz_offline_copy_data_newVersion': { + 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","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"17"},"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","6e218e5d129105c20ac499307b260eb76bb2e753f6c319e17efdb848675c5fa2":"20"},"data":"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"},"preferences":{"data":"lwtXtArw4a27+tL3R9WRPagZT7T949t3Btdf3HHQ7w5vb7rkmjipAfjbuQHuMUxy"},"oneTimePasswords":{"data":"j6xAAs7uiQRbzdHADZO4wUKkUhwvqLR1tz5kIdHpTv0KIfJuSx96FoOjuHcOeskbxvPVr2b3fYYvvdzM1d4jWu2bg13ZIL44xwakhXlCwc+2dbYpkJgN5nY7D7/BwN3q3ctWlsE9dllYZ+bC2LQfb+lgxJonhCLF28BOWh3uae14xbdAHZ314MZmmju+xRZ7iY2GEu1/Z3Cuuf0hwpbSaY233iJeN5Ooc32rF1eHo9RrlcJVTKGzN74QQ+9f90lq+XlOFx3IfWba0axFxHlQLk2gnGwu7TX++LV9zpBk9MfRUDN2b1Rb0t/GWT6kQLtO+6Y+oTTlebc3dDbqIx8u5tFhOzELoS2fYctMTvW9XKg953cyFRHfmmq9b6NnAIoespck+gF4LeH8Ips0nqVnr3t2OpGnNk3ek4BYjzpgIqpN1+VrdciXQfo5bZFvAD7RHEP6HPSziRsoSml+5qyF8bAJvQxZwpWHYuCubeowAJX5FyoETtB1VRO4I3lYA1xhZgaJYyp3dAqezaXOZhLoq7hsneKczwpJFZGlNrWTbjpWYYh3Oijv2FGKaNUXz24pAP4FbweAtzE8Hbwpq3rgxVC9k1vWlSJRhSmJEDdNO9MFtVYcgoetnkK1bsYROQLQA9DA0Hy8Ew=="},"version":"0.1"}', + statistics: 'QJDMnceWmEr3hl6ZcSh8YffA', + 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 07:46:44 PDT 2007', + updateDate: 'Wed Mar 14 07:46:44 PDT 2007', + accessDate: 'Sat Oct 24 02:11:37 PDT 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 07:46:44 PDT 2007', + updateDate: 'Wed Mar 14 07:46:44 PDT 2007', + accessDate: 'Sat Oct 24 02:11:37 PDT 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 07:49:20 PDT 2008', + updateDate: 'Mon Oct 27 00:58:49 PDT 2008', + accessDate: 'Sat Oct 24 02:11:26 PDT 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 08:00:31 PDT 2008', + updateDate: 'Fri Oct 17 08:00:31 PDT 2008', + accessDate: 'Fri Oct 17 08:00:31 PDT 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 07:49:20 PDT 2008', + updateDate: 'Fri Oct 17 07:49:20 PDT 2008', + accessDate: 'Fri Oct 17 07:54:23 PDT 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 08:00:13 PDT 2008', + updateDate: 'Fri Oct 17 08:00:13 PDT 2008', + accessDate: 'Fri Oct 17 08:00:13 PDT 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 07:59:31 PDT 2008', + updateDate: 'Fri Oct 17 07:59:31 PDT 2008', + accessDate: 'Fri Oct 17 07:59:31 PDT 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 00:58:49 PDT 2008', + updateDate: 'Mon Oct 27 00:58:49 PDT 2008', + accessDate: 'Sat Oct 24 02:11:26 PDT 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 07:57:17 PDT 2008', + updateDate: 'Fri Oct 17 07:57:17 PDT 2008', + accessDate: 'Fri Oct 17 07:57:17 PDT 2008' + }, + 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { + header: '####', + data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', + version: '0.3', + creationDate: 'Fri Oct 17 07:58:00 PDT 2008', + updateDate: 'Fri Oct 17 07:58:00 PDT 2008', + accessDate: 'Fri Oct 17 07:58:00 PDT 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 08:01:59 PDT 2008', + updateDate: 'Fri Oct 17 08:01:59 PDT 2008', + accessDate: 'Mon Oct 27 00:57:58 PDT 2008' + } + } + }, + '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { + data: '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', + version: '0.3', + creationDate: 'Wed Mar 14 06:53:11 PDT 2007', + updateDate: 'Fri Oct 30 10:52:54 PDT 2009', + accessDate: 'Fri Oct 30 10:54:46 PDT 2009', + currentVersion: '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5', + versions: { + '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { + header: '####', + data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', + version: '0.2', + creationDate: 'Tue Apr 17 10:13:41 PDT 2007', + updateDate: 'Tue Apr 17 10:13:41 PDT 2007', + accessDate: 'Tue Apr 17 10:13:41 PDT 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 06:53:11 PDT 2007', + updateDate: 'Wed Mar 14 06:53:11 PDT 2007', + accessDate: 'Wed Mar 14 07:24:35 PDT 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 07:33:00 PDT 2007', + updateDate: 'Wed Mar 14 07:33:00 PDT 2007', + accessDate: 'Tue Apr 17 10:12:56 PDT 2007' + }, + '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda': { + header: '####', + data: '9rcbGeLFjW1cwULSScOa5zfb9BZqoSi8IvarxwjLVz+4VqApsBZnwJsxJHq/L9zV3SRYlAQRRLNy3lhpO/fJAOg4RNp68KdtA+IZfCsn1MzwfOoBrnTTELPKxDim4US9xQNdJp5ffWoLB8demEL2YkSNTrPVr5crvVPyepuRCzdqUoe6Dba05tR6Ju7/+d9K/cfJg+KI/ziSUSVlOTsIahGkipvMwYzhCOqjljJvdeF6XLLCh7F70lFvpW5vtv5jNmpkgvAhfxgovIZ3tav0WDc+DEdFNHNsCtFhwRYsb1dH5Ry01M8g4vS7PDkuCNYOvjL9bS2Wmy/lVulM9dYdB/d/gKWTjbqgre/IR1TPPdtfiVBo2J9PUvM8P/c2LmQrf63OwjWT74N0D7q/NuVn1KXzREQiyMi6ezzujzJolpNVUNkJFlnSHl+EqnfFiiR5ALZ7Nts4uWLe4Vpn0XmyvHoAVDBK3fw7e3n0tIG4x6k95guIWRKdDpYLOTHOe9jKJbc6KxdGmt21/5pX4KdeWavwirKRcXW6ReJIOVF+KREEZZOGWu7UKWgqgdaMuvxO472zzXzxTBvnpOmnxl/oIkhs23OPxHEwHXX8gXnyA60hd2tthCfmzfI48wWkO40cUTFnqO8htWRXwbUa9gYTjYWDTmoIyK9AgO+PfBLNqx3JzJYAymDcw39ItO2lIcEBkZ4=', + version: '0.3', + previousVersion: '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544', + previousVersionKey: 'RDzOj7LWZcdVg5KmmIT5VXM0cUFeC9tC3n0IXDfNpj12cq0w3k1rpBYbt4eSEkOcdM7Va07FPNdZY4Pd65xBo2MGc56Ka1pX3wW4jTxz350qtw==', + creationDate: 'Fri Sep 11 05:54:50 PDT 2009', + updateDate: 'Fri Sep 11 05:54:50 PDT 2009', + accessDate: 'Fri Sep 11 05:54:50 PDT 2009' + }, + '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549': { + header: '####', + data: '0ck0NbHAOYieUs5c1U6xSMf3pj743aIv1nnBnB7f4vsvKpMiYleQwr4SwY1W6vhg+3sLnO9C0CCD8Brt4V1wScz/STp4oB3hoy31W4dsAFsUyAWFJ8MrYDsZW3jotIPVbMKxu+4Yp051iDPcFKimDhfAu1zVyiVE9llNj3tP6d9gukUNfGZ5CvFmEXcheHB8t81Z2tgeO70EELFUn7uqKJwh5xCqTeogPtsifmCjgx8Yo6hi19vl2TDAaX0HquFO3WcIAL185tzYZ5rU23BYwxD7hVfan7lngSVq614MsEB3EX9WiHRoissSSajNkKTlTW8zsNj3VlUXKMQiJ2aA9Pi+/Yt9sNAbmyTl6T5TNN4QSquLPLyxO4p+OIjra1WPdmVsCti7fOyGirogfJF0XhZg4imvGXK0c6lPZIlg/OEnoDSTiHXlOYpSgaEw1Js5HZ+390XY0KYPtpsZlY+oeVS4p29HN7x3CEairuIldEsZrk4whiVcwzlnmw3n8wiewumus4eRh9w0CIwJELKeMiz5cX4bX8+AKS+u8O1W0GwKlEGTj/joA/M=', + version: '0.3', + previousVersion: 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd', + previousVersionKey: 'moIwxP20kmN6f/+pgb8pJNqsLUz8Qo2BvcAFnXBmiX2E4oL1pakM9iq0e3IAiNLApmID2TwyAxhsmKj422R9uWXsUFd84LRRt6lMKa3/u1dC1w==', + creationDate: 'Sun Oct 04 14:05:10 PDT 2009', + updateDate: 'Sun Oct 04 14:05:10 PDT 2009', + accessDate: 'Fri Oct 30 10:52:36 PDT 2009' + }, + '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { + header: '####', + data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', + version: '0.2', + creationDate: 'Wed Mar 14 07:26:35 PDT 2007', + updateDate: 'Wed Mar 14 07:26:35 PDT 2007', + accessDate: 'Wed Mar 14 07:26:35 PDT 2007' + }, + '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043': { + header: '####', + data: 'jt/CbXS+TEjH/jPrstH7cQZGK3yse470grrhdAOdWoGVtFMmL7fMJZQOKm5IQSrMHFEsH3PoSs99Rr4ui/u71vUb6s/TIsjyv7yihnCYVsOEJOPcnL2wynciILV8p48Lky1wGztW+oSynYOG0CGYDofFhF/MNCBsG1EcTqW7Cf+8rUiS4nA4ZRZVv3HsZp6rCabJsAoK1pmf5tXGJHPjS6xdy1A9ea4bV5Gad0pu8IXvjbZTrDymHem0t8C+oZ7uJ/mG9cFVcNykXoO/TDP0goD6KvTqtdY3VWNNTAERycAW6jFtdMv2W/AFNmnYatZ+EbSbj6/RyGaNnRv/ceBitMh73HRr1EVtZw0wPthMBXwnlPbpkfUwWPBHYpwImligm62/6YBhxDgnMZta7TSi8apT', + version: '0.3', + previousVersion: 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521', + previousVersionKey: '8BbhE8C41VX8B8m3TbfLz4bgSfE01IAUl8Zlu2YFdEhpw1erqInN1eRE6WLyBB5MxckmJpbn6VSizqbFbi/3Id5p/fibHKmbmNp6xu7iIo5zzA==', + creationDate: 'Fri May 22 03:30:43 PDT 2009', + updateDate: 'Fri May 22 03:30:43 PDT 2009', + accessDate: 'Fri May 22 03:31:39 PDT 2009' + }, + '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544': { + header: '####', + data: 'XKsPGp4MeuvDrgikcjbMnmw/Gz74sTfyP3lLylbrtEZJ3aGSjRvE7s9o3Ya9GKRhYxNQ0dXT0vM6xIE6r/dMt8PwU+/5dNtRhCGPAHvKmEEGb6EBwR7gUDxQLyFTAYX8ut+CpyNJLQa2pHoEl5aNUTjk6blYrKp0GHKt2Q3PZrjIn78rcOLcKY5bx4OK0h9rN0G8mOFQ0g29knKyaykv8dja/Uy5XBeshKnVT7YRHk1nRuwz69ZcX+1Z2qzfw5sxJx+fDK+otWVpjzDP02qqn7ju/r3GgSnW8p/ghBeurUCLdQiS+fFAevhOwCkZGjPMntG3Q4qVt42VxIiiuvfShdaSsNMOW9Uziew3XwOYL9mNIOSdPSjtry4sKrAh3XNmfuJjWTy+69Iyi85CtQ6xMFilANgSBfTqThUePCrEkv9ZBbvpRovuuljlxqZ3gUmtvwy9a3ACAr8SMGWX0ydQjKyvZhoGRCBM+ZC7zCe/JmIpdklvNd/+HqUgS2iAnf3CeH4gUPQVizFR04Ysgj00xO6v4bdY2bYVKIxunygBGNzySi8DeSREu/rUKWgx0KY7S+Gg/jqFMYpE9oy8CxUCmSLeNrnxUgprPqKrr72yue0kBGVoYyJwhXo4MG+LPV0rtVp8b2GeHE9fYmyEZO2Ke93SrHjezS6CnWQsvjYsFYCLdLtEGwo3mpS46DF69LlO53k=', + version: '0.3', + previousVersion: '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447', + previousVersionKey: 'eEvij0YZ1r+5cNNpleVHE+kjCZlSggZuE+3Kum9b/11JGHTgQ3bY/o5amM+4+FPaiCU0Zd6MWFAI4dPscyvAS9in6WdTOm7z3fQ3uqYAtHghPw==', + creationDate: 'Fri Sep 11 05:54:01 PDT 2009', + updateDate: 'Fri Sep 11 05:54:01 PDT 2009', + accessDate: 'Fri Sep 11 05:54:01 PDT 2009' + }, + '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { + header: '####', + data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', + version: '0.2', + creationDate: 'Wed Mar 14 07:30:09 PDT 2007', + updateDate: 'Wed Mar 14 07:30:09 PDT 2007', + accessDate: 'Wed Mar 14 07:30:09 PDT 2007' + }, + '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': { + header: '####', + data: 't4ohy1/z6oUzyQLtqQoumRzcLCnaYjL/+WQGwE6yIXaGEhCWywe0aIVusPKLcsfYTCXVU1/dXtuucaZoMw7PMSOUx9awTp14NmShaT/9VKChZf1TLi0CO2jOUGsvO4DHlNAQhJhas431l83F+h5+hrkqX8j5kIhzpwlroGEjkml0fswmmwDyHbSTgVEyErZc+b3V+9oUCwzYvd9ITHh8uWLa6j+GuwZTZAk2FY7Vzoh9K46WO3/qCz1pJ8JVkcffun9alK8qzK0Wp05mMLIrt+WHFFTKrG9zpBkcswkbwhJ5ZnakfYLJ8GPH7fKnAid1FGW0Owms058smDBmFO20HyH+ho7SL80Q689W+Jx0+nkUKvxWtq9BWLW6Z3ClDZOVITeg35gQVr6aRzZ+VZwbAy++', + version: '0.3', + previousVersion: '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043', + previousVersionKey: 'i4e0h4QhuN0B39drNLsOWruy+R64siKHWxc9YXgpoCPitWL/ika1MVCRX7CJC7lH5WD9yzx6l9isAy/Hb3nUIEp97VcFKG4S0gOaZkdWNZ/U5Q==', + creationDate: 'Fri May 22 03:31:46 PDT 2009', + updateDate: 'Fri May 22 03:31:46 PDT 2009', + accessDate: 'Mon Jun 15 15:20:17 PDT 2009' + }, + '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447': { + header: '####', + data: 'LDAixBQ/CEqQX35jio3aAXG+Py4wNylXI1mQJ5IDxnpqmkFZfOXCaScpwIkQwQzEOjh9p3cOShzrBm6r234HKxgg0ufFnkTWbQSjCgekfVEqiBFi2rWSj5v6a5LMANLwtCz0b2IPr6Z8LSPddgao7P0nwBdCiKJAnY/uGdvSn67WSFhAUGAIs5ZKIZQf8Zi+cA3hd+Xlv1W/2+OXLaIPTkD1bCuQo5qEiAoOl5mXngWOmQ2kTGpC7Hfkknm/uzDeiZTe8VpGjqKTwB/tl64LU5OD26DMpihnVeQNqMpYndEJO7Yu9Zodv8WMyYmVlrw1UzTB4BLTL337vVm5uBiUjAfJIwJx3b3fXxdEiWFuK8uwOXAO2X9OOKfLPuowOj21B/+zRLum3Dti23IfHab5KwSq72sB/vjpl/KVbcGsWZET4VTCZvO04T6Emjb2UBLFLIgInZ9tqN4RXSKz0Uj4n+pitmFSDleuPtL8EzEESX6FtmT/IVdr5AGNjv93wIk5CgeoK2YiNlpTb+CHbcA5HPn+TH9T4999mWrJh5hxZ1vGYxlAd1AveMCgA3y/Wl+kZKMnUatXPM0deUS1GnzpoRXtI0dUi6J5sOHxeahZL0TQbCbHcKkoaSJklMl5YEVaLXyakO4ATKyNcsPfDQrPvWfra1I59RI3seStv2Q0bs14Zco+0opvKN71R/HxjF/etUU=', + version: '0.3', + previousVersion: 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b', + previousVersionKey: '3JAEXzigeX/PwpA42+K/CPSpP40EO/j++M6pB0NF71EfKCApWSWy89flo0KbrckF+mUAjyY2hLYBc/F+Q2vgGNhAZqq0vo3wcUpFjFktqgRZ4A==', + creationDate: 'Mon Jun 15 15:21:15 PDT 2009', + updateDate: 'Mon Jun 15 15:21:15 PDT 2009', + accessDate: 'Fri Sep 11 05:53:23 PDT 2009' + }, + '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { + header: '####', + data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', + version: '0.2', + creationDate: 'Tue Apr 17 10:17:52 PDT 2007', + updateDate: 'Tue Apr 17 10:17:52 PDT 2007', + accessDate: 'Fri May 22 03:27:59 PDT 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 07:27:35 PDT 2007', + updateDate: 'Wed Mar 14 07:27:35 PDT 2007', + accessDate: 'Wed Mar 14 07:27:35 PDT 2007' + }, + 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888': { + header: '####', + data: 'ZRJXJ72ZBH01gAML0R7n42fI0WjdbVXzyZH7H5MP2RgtGuVvfdadVK9+U8mzdf1Et9DoKrHhZUp9baeREPO/Fk0r2IO8NmKv/8+rMkK6x4qeWnI8ZAJfQemGtqke/VcTn4KGAyTeV8arzXn/whsLpp/xN087NdDw9dP8PLb43Yk8TNC1m2d85FUagSh4NOI3rmcbHAiCOQpqHBPBoJY1Vf4Pxu949TEUm6kT6Rl0n/sb3PSLu4LSa6+WiGZJ4mgE+3XZyfozrJsvGoTYSkim3MTwhrCLEVaDMTq4Ei6FyG+TeV95Q9Ei8HHwBqdp0fxUxavNe67Oo4m+ECiRvZ24b5+Nz6POBjXfn+61yCyIhz3SV3IaYIF3rgXRZA1q2sax8kRGtoG7ONxczUqGyQ5S6Lht', + version: '0.3', + previousVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', + previousVersionKey: 'ZbGA3id5JTGeRjVUR/LkntSGjPDEbZbNrQxc4SiQDdlDO3dJNVpfRp69PSk6vqEiZ4r/6OKvE+fl2TtPadJQ82fP7WsULtrSkYryQL+CQvz0VA==', + creationDate: 'Fri May 22 03:28:11 PDT 2009', + updateDate: 'Fri May 22 03:28:11 PDT 2009', + accessDate: 'Fri May 22 03:29:03 PDT 2009' + }, + 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521': { + header: '####', + data: '6TAJAQ4qE5l2SybVzeEqQxYZgVow0MKzl8xwfoE0HeuSr8uJlszGas5NaJL1SFI5sDDwIJzbtIBE/yjaNwWw18+JzswIWmkLW+kTIAtJKjNtWnaGlDJMTA4OIo5gj2Vqq4o1VngzMTk/DV6f5ob3/HxN+YpE4r1u2SUVeADbjcyjRmYE9ygvuvQ5AuU3u2hzmstI582kBlksLPGhX6nJfAPCrSkdphNj28T393p5w82/FFCFNHKjgKN/xI3Rotq7rObFaNid1tmHvozKLYeLQQfjglJ2rRDQDTOJONRVJEObDFV5bmaY4z3XljO2nbQ4iMK5CrTFAYTYNph3/WOQWjZHWmAXaHMYvBSlICvF99C530sOGQYIaBWKFuOv/pNuCZh/tBNVcI4pU1dz438/7LQf', + version: '0.3', + previousVersion: 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127', + previousVersionKey: 'U2Z+xaFl6o4XH/8DktJimjP3+1PaYRf1mZPW0sulAOykDH0LY2U+kbBj+mfNV8rVAJlA7O8LYl8AlUNZUTS+036MiIinpD0Tmhkc91rFkMYgbw==', + creationDate: 'Fri May 22 03:30:03 PDT 2009', + updateDate: 'Fri May 22 03:30:03 PDT 2009', + accessDate: 'Fri May 22 03:30:36 PDT 2009' + }, + 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd': { + header: '####', + data: 'zqOJI8Qken5hwXQ4MFRzfnB5tnROjMhg9mw+aYwwvI8VV8aADoyPuaRi6bdxy4LP45PqVR9G2iXFT+h/WaBql+rz1AA5AVz54cpd2gdDh8Eec/PJXyL3SfXW1PQoO3bwhW6rkR5cNQf8xKxlmGWLvE88AXT65tV/RdYJE574aVEZexzo/40X60weCl1ZITl8IH97eug5URe1lSBFsy5sjo+SE09FqtnmnGy4O2LL+0XSR7xJqiJihv80msEgk3lTbwUEiGWm3OiDnvLk0GjaMy3+EGV2/rHZuICMJkD4ge6cIBc/h00ZCFnXN4bX+OC/KpEFgtnPgQ+duVpsVNdYmNwxSavyFs/UnFFDTDIPZxEKhRHFTW9zaqu2jVTZd4+/ro6TSYSlEN6F/jtiL06nM/F14Bp/dYuqBZfc+N3vx+72jj6IOKTHtqvlj6jdSZseN8olODT2IGI/fsjR79biVCIOODAaF6DCd32ClvoenCVPTIhMc2AfuKTbleiquk95nN4lgpZbMzrrvWHPJD0oKXHo8X1GJd19QCj+IhzCTx1Ap1JPOTMIG+reaxxwicGjH5Iios5DmA4gjsRWj9BVr+QmMJmY4KTpyRG1lVYovm78VWf0nzyGLNx5sgWrRyYLOI75m0zUdNGDUpKGSyqrIuEwOrI36uRr71MvJ0ui1HXBkDbPIvrQ01UyocO1paeHyTk=', + version: '0.3', + previousVersion: '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda', + previousVersionKey: 'zOAbF4q8A+LjWfMMXHRHH2DmzdToA6a2U12y0G6cyAm5tvz1BrrAcgk/5dx0yvFF+ZSxuOOfnvCPVBN2kT75otq44tVEg+FSJ4khcC6HThCluA==', + creationDate: 'Fri Sep 11 05:56:02 PDT 2009', + updateDate: 'Fri Sep 11 05:56:02 PDT 2009', + accessDate: 'Sun Oct 04 14:04:58 PDT 2009' + }, + '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 10:15:09 PDT 2007', + updateDate: 'Tue Apr 17 10:15:09 PDT 2007', + accessDate: 'Tue Apr 17 10:17:01 PDT 2007' + }, + 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b': { + header: '####', + data: 'Al9KSfdnvVJW+GPqYbIGXNDb4KefUjtkNTJbk0zlBsyeZc+eoDDLJKy3ukugFfDFDmX+g0U3lp1UIsRQB7JHEZ+NWKPJu/hyvbTmwuVFZUnGEZMhMOIqc6nECN+VFCllxV7QBKpdcRJ3E3fiYP4fV0v8wquOD1dfsMs26f3y2fOQLNS0+UpDe0GoRw2R3+lbot3qlftdO6vb5+LYjZEjdSI/G2fPQ3VsS8N0KLLNVHQxix4xn4Qn78i/ImlxbtyoKNLP4ZIaXZ9ELuGvV+yKaQVOVTwxpJOWKMu1Do55cMwdFjxU7Gid03xEYEaZpClcsrbwdGgkJo2+WnpC/L9G4I9X5L+sVISbO49PaZ9DMdQJAlY5QCIjokPchYUp9Vr9u4KcgbAw9FrLQAMSRLnWhf0bLr0mv2ioTOlQKPFBkTIuMnsyglD856ZYQOIHl48+K5HvUZYZqI5UJjPXdrmzycD/Yxt878pSnkkfeyX0Cr/7Rwfq/zOPN5XJcwsO6j9ubuXjnIos0E/SG1BOKrLY+sE7SXzWOqhpzkApb6ILaGhtHNOHmYAckpPAqCe85g/XPZsmWjsABB64Gwg9oviC2ew/IDXigNXGtY8tbQmAny58QPfRihT5HxCRMFP2pA1Xh2WU1vEXtP8=', + version: '0.3', + previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7', + previousVersionKey: 'B0wCj/b+UZP07a7VlnKVl/wtiaFzCmPux+T4tBFQati+nSNQCHUQM2XAQ3n1VWeewIyLjKlVI6W7SXRZnCxlcOdqBLDymDkhKfL0FIvmHNKmig==', + creationDate: 'Mon Jun 15 15:20:54 PDT 2009', + updateDate: 'Mon Jun 15 15:20:54 PDT 2009', + accessDate: 'Mon Jun 15 15:20:54 PDT 2009' + }, + 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127': { + header: '####', + data: 'mZNwCsPrEohGEYglwUcTQNPDGJWoQRcRDIoWJ482qFJu617UU3Y0hML3CZ+ALtITVpnZl6mGZ3nHCpigt5naJmvwjyV9O7SVkGjc7mrzvjQSP2jrlXGXVIPqjsywDgG74bmaOPLEstQ9Sb2UPGIdinYdDglvQsIaFHQaWHO9bSYLjitfuS+qH2erK/QhqJQ56LxSpcnF5pevfuKZVAkrfhYAhIxqSQ15lZ3QSHxJfT8pQntR8QWL65RetkX/c9eydWyPqVFKqCTghU18p2Omz74UEakBBh3o6DxeTw90UY4YM1tRmsalS3oYG00BFDfDD3mEVZNSrqsxdCikqUSEGvq82whYxsFTj/5fHVLoJybYg5MfpLR+iW8O94g9p2d3jx2mTeNNjOZp+Q5/Wc4rKS7r', + version: '0.3', + previousVersion: 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888', + previousVersionKey: 'RFTIyzDM9GP+QklGI/YfTgxB64iqyF7+c7bZntSZlFFDkiVN7pJbToZjl47c272J4dPXFxkORR2o+pIyYDdRvKQZQ/oHXp9aZi5BDKGwHYkl8w==', + creationDate: 'Fri May 22 03:29:12 PDT 2009', + updateDate: 'Fri May 22 03:29:12 PDT 2009', + accessDate: 'Fri May 22 03:29:51 PDT 2009' + }, + '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5': { + header: '####', + data: '8mmpKGrkSqiLyreEtGdKN9EXeb47uEN+XkSXEhdIxkMkmvR0A/AGtKjG1o6bbSXfPzAtfrMfJJxwyhWcRVqcikzc0KwINua4X+1Grf7QG2IOYYFqujmLyCwClGSRaannCAbio7+YI2PlDrlMrwB38RvMde6zrMfZzl2O75nkVX3DH+5IHJpwwYeukTSAu5EQR17oed+xoSHkKCQG3ToTsbnGPwZSGM0D+aiTXVW+PJD8D8LvDEU8i3EHQ9E02+d3dKPV/3FGRDgvwLIIjHU0qX5khYJ9PjqSgAxOhRKFwnG1kJn6NG1rvsXYgefJORElib/xijoCM9EJkUZ9e340WwhfZa1GbV7gLEbVn2aeaLcaTjhtPz9pL9WQOklChvdi/0XaHRrgflHogqC0qUQ63lA2CFOXwR9EXspZIi+zLzgAaEMGN0NlnbGHjAiVz6SVU/RUkh3DkKmMuGNS1n93spVbMMLZgcT5zxBFzT6jARvC8qKaxe9UlbMIH8ZCXMrq26V/sEZrxmPT3FZB+dmmqA9lLEBFEcw927uu1U3kZwXhQArQCN3MbEQ=', + version: '0.3', + previousVersion: '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549', + previousVersionKey: 'gxQ13UMdZF0F7chGySUkuhxxSJ7CU2wubdG0tijs2G9uxYEY6ADjVX6zi3nrft7ggnLM8LyuFtZqj1wMX3pMUsbxZq0v2vfpVaYZ9cN1pahwMQ==', + creationDate: 'Fri Oct 30 10:52:54 PDT 2009', + updateDate: 'Fri Oct 30 10:52:54 PDT 2009', + accessDate: 'Fri Oct 30 10:54:46 PDT 2009' + } + } + }, + '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 10:39:35 PDT 2007', + updateDate: 'Mon Oct 27 01:16:14 PDT 2008', + accessDate: 'Sat Oct 24 02:11:24 PDT 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 10:39:55 PDT 2007', + updateDate: 'Wed Mar 14 10:39:55 PDT 2007', + accessDate: 'Mon Oct 27 01:07:56 PDT 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 01:09:11 PDT 2008', + updateDate: 'Mon Oct 27 01:09:11 PDT 2008', + accessDate: 'Mon Oct 27 01:15:58 PDT 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 10:39:35 PDT 2007', + updateDate: 'Wed Mar 14 10:39:35 PDT 2007', + accessDate: 'Wed Mar 14 10:39:35 PDT 2007' + }, + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', + version: '0.3', + creationDate: 'Mon Oct 27 01:16:14 PDT 2008', + updateDate: 'Mon Oct 27 01:16:14 PDT 2008', + accessDate: 'Sat Oct 24 02:11:24 PDT 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 08:01:24 PDT 2007', + updateDate: 'Wed Mar 14 08:01:24 PDT 2007', + accessDate: 'Sat Oct 24 02:11:41 PDT 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 08:01:24 PDT 2007', + updateDate: 'Wed Mar 14 08:01:24 PDT 2007', + accessDate: 'Sat Oct 24 02:11:41 PDT 2009' + } + } + }, + '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { + data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', + version: '0.2', + creationDate: 'Tue Apr 17 07:36:08 PDT 2007', + updateDate: 'Tue Apr 17 07:36:08 PDT 2007', + accessDate: 'Sat Oct 24 02:11:21 PDT 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 07:36:08 PDT 2007', + updateDate: 'Tue Apr 17 07:36:08 PDT 2007', + accessDate: 'Sat Oct 24 02:11:21 PDT 2009' + } + } + }, + '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { + data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', + version: '0.2', + creationDate: 'Mon Apr 02 10:12:44 PDT 2007', + updateDate: 'Mon Apr 02 10:12:44 PDT 2007', + accessDate: 'Sat Oct 24 02:11:40 PDT 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 10:12:44 PDT 2007', + updateDate: 'Mon Apr 02 10:12:44 PDT 2007', + accessDate: 'Sat Oct 24 02:11:40 PDT 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 11:09:05 PDT 2007', + updateDate: 'Wed Mar 14 11:09:05 PDT 2007', + accessDate: 'Sat Oct 24 02:11:48 PDT 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 11:09:05 PDT 2007', + updateDate: 'Wed Mar 14 11:09:05 PDT 2007', + accessDate: 'Sat Oct 24 02:11:48 PDT 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: 'Mon Apr 30 16:10:17 PDT 2007', + updateDate: 'Mon Apr 30 16:13:27 PDT 2007', + accessDate: 'Sat Oct 24 02:11:35 PDT 2009', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { + header: '####', + data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8', + version: '0.2', + creationDate: 'Mon Apr 30 16:10:17 PDT 2007', + updateDate: 'Mon Apr 30 16:10:17 PDT 2007', + accessDate: 'Mon Apr 30 16:10:17 PDT 2007' + }, + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=', + version: '0.2', + creationDate: 'Mon Apr 30 16:13:27 PDT 2007', + updateDate: 'Mon Apr 30 16:13:27 PDT 2007', + accessDate: 'Sat Oct 24 02:11:35 PDT 2009' + } + } + }, + '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { + data: 'xSjnJLMCEBBiOM2RxFm2EUCxMy9a2eexGsBj851cR/PsJlfG1lCh8HwD1i7HEWVFB2GBK9Pf+U7TpNSYsq9VY+AzBNz4p1aSg3Hswoou4OpCCgnBpeNLkr0q7KBmSVmSH+omECgWzbqux3LiqT7yEWxemVRA4ah4a09DvhB9bpVJiteBGg==', + version: '0.3', + creationDate: 'Wed Mar 21 08:29:06 PDT 2007', + updateDate: 'Sun Oct 04 14:06:08 PDT 2009', + accessDate: 'Sat Oct 24 02:11:33 PDT 2009', + currentVersion: 'a999c255e435e85633f136d0464f29e6d41f87f46e6fb50ca63adeede9a6650a', + 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 08:29:06 PDT 2007', + updateDate: 'Wed Mar 21 08:29:06 PDT 2007', + accessDate: 'Sun Oct 04 14:05:49 PDT 2009' + }, + 'a999c255e435e85633f136d0464f29e6d41f87f46e6fb50ca63adeede9a6650a': { + header: '####', + data: 'xw9i2USOB2xkgG3MBp1+qq9e2nwapnEt0usRAVmUWXcGGLbXJi+ImdrFNGPg3TSZrTIXMdEbLmjxAcxpTWlBfd5NhBVDzY2q/stiNaUWfI8JAHdl7E2CQRHa9quVnxPzYytVbUP01xoUokBWKQnqHZduADt7OKcgLy5iheR0ECoFXT6lKcJtD8mV5TZqKlYHkhNR8FehkNrhX2BWfxDHtlxZQNOK6xBCHF9YQGk3PQqmeIAbvxMiN2sGCdH4pXAURHIcF4uayV96bmCa42r+i4h2p46BcNghSR84ipC6Fyh1y+oGyZ5GqaolmVQcZQ5UbCba57+r5OOSWqmpmbhyoZ8rPOa/ZYFiZDj9UqNl7Ny6fB7PqWjVs9oSLb3oLe3oqfrONvJ/WmttA5J/jztDYYN0peN4AAEiNQLnFZuoHp4S+Wxuf0c+99N+I0egIIgIw88+ssowwMY6Xrf6sxEmA7B6hXB5V7TO3J1DGkVr4Kw6NgxMrFVw1AlqNpBrxKdREYaGRmLwB8/jOC9tr2RzP6SPylXzeOk9/v3XikG0CZckPATqLG2otmZ0pVpJc5XwyKKhDAZWYEzPKXXZoLfdNoa4SAiGF7/otBtH8k1D8d2rDMlhigIjtYR8WvBxCdfvnFeD8w0zewymA1Fbj72Dv8eHtnnNYYsJiHldQimSgcaGkmyFr0oVPo/skLjRjBsQVbiE066eTAjqrcAfKK7pg295Mhgo1aU9cyFPfOha1yiM6BKulihLTMbCr2+KTdMGagVnBxKFmfWJBNbl1J/b5ztazo3A4rIOddUPmGj0uQpaOVLDaFIVvs+3d13JB3iyYOz1nAYlOptS0yzNEMlJMDX4F5gkABGFazoPPQ7PgQ5JUmRrO4BBnp4HvJHNY0Ix9LOUfaLcp/533C43fHTcofB0AVqpdnU2R4lPl9FkUsyeQ1vmY3Z7tE0ZNbM3rE1P26LlEfXg9xbSBzRwS5EOxZF2ZJv9h9a8VPPbMnEUt0dZrXhyUycHF4SfnKLmepZkHTnco64kY9Mc0vJzy5gPCF7z6SDzeA35SX2T25Rl6M+xKSeU1vCv5kPWDpacFhXX/aVJnSlgjYKEWzV4jTGdlg2RA+034JpbsJgDTIqdLYdC44EyZwocR7MObXf0OTprugDIM9AGHFlxPda+TO6Cg0mI7UMYEP/D7AU=', + version: '0.3', + previousVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + previousVersionKey: 'tVHT9HgAaAzSOMZrMyvyTvuJW6P6cSGU0lUWky8NCtKipfN1BPGcX3sVgEf/PTXwKlNxTgpogRDGhDMIl01RHPaqAIXY+W4x/u3bdH/c2NTlJg==', + creationDate: 'Sun Oct 04 14:06:08 PDT 2009', + updateDate: 'Sun Oct 04 14:06:08 PDT 2009', + accessDate: 'Sat Oct 24 02:11:33 PDT 2009' + } + } + }, + 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': { + data: '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', + version: '0.3', + creationDate: 'Thu Feb 12 03:45:43 PST 2009', + updateDate: 'Thu Feb 12 03:54:37 PST 2009', + accessDate: 'Sat Oct 24 02:11:45 PDT 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 03:54:37 PST 2009', + updateDate: 'Thu Feb 12 03:54:37 PST 2009', + accessDate: 'Sat Oct 24 02:11:45 PDT 2009' + }, + '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': { + header: '####', + data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==', + version: '0.3', + creationDate: 'Thu Feb 12 03:45:43 PST 2009', + updateDate: 'Thu Feb 12 03:45:43 PST 2009', + accessDate: 'Thu Feb 12 03:45:43 PST 2009' + }, + '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': { + header: '####', + data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==', + version: '0.3', + creationDate: 'Thu Feb 12 03:47:39 PST 2009', + updateDate: 'Thu Feb 12 03:47:39 PST 2009', + accessDate: 'Thu Feb 12 03:47:39 PST 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 07:51:17 PDT 2007', + updateDate: 'Wed Apr 25 02:14:05 PDT 2007', + accessDate: 'Sat Oct 24 02:11:43 PDT 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 07:51:17 PDT 2007', + updateDate: 'Wed Mar 14 07:51:17 PDT 2007', + accessDate: 'Wed Apr 25 01:37:27 PDT 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 01:39:26 PDT 2007', + updateDate: 'Wed Apr 25 01:39:26 PDT 2007', + accessDate: 'Wed Apr 25 01:39:26 PDT 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 02:14:05 PDT 2007', + updateDate: 'Wed Apr 25 02:14:05 PDT 2007', + accessDate: 'Sat Oct 24 02:11:43 PDT 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 01:51:49 PDT 2007', + updateDate: 'Wed Apr 25 01:51:49 PDT 2007', + accessDate: 'Wed Apr 25 01:51:49 PDT 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 02:01:21 PDT 2007', + updateDate: 'Wed Apr 25 02:01:21 PDT 2007', + accessDate: 'Wed Apr 25 02:01:21 PDT 2007' + }, + 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': { + header: '####', + data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=', + version: '0.2', + creationDate: 'Wed Apr 25 01:59:57 PDT 2007', + updateDate: 'Wed Apr 25 01:59:57 PDT 2007', + accessDate: 'Wed Apr 25 01:59:57 PDT 2007' + }, + 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': { + header: '####', + data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+', + version: '0.2', + creationDate: 'Wed Apr 25 01:38:17 PDT 2007', + updateDate: 'Wed Apr 25 01:38:17 PDT 2007', + accessDate: 'Wed Apr 25 01:38:17 PDT 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 01:56:58 PDT 2007', + updateDate: 'Wed Apr 25 01:56:58 PDT 2007', + accessDate: 'Wed Apr 25 01:56:58 PDT 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 01:58:33 PDT 2007', + updateDate: 'Wed Apr 25 01:58:33 PDT 2007', + accessDate: 'Wed Apr 25 01:58:33 PDT 2007' + } + } + }, + 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 08:06:54 PDT 2007', + updateDate: 'Tue Apr 17 10:23:41 PDT 2007', + accessDate: 'Sat Oct 24 02:11:49 PDT 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 09:27:40 PDT 2007', + updateDate: 'Wed Mar 14 09:27:40 PDT 2007', + accessDate: 'Wed Mar 14 11:00:21 PDT 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 08:09:07 PDT 2007', + updateDate: 'Wed Mar 14 08:09:07 PDT 2007', + accessDate: 'Wed Mar 14 08:39:40 PDT 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 11:01:05 PDT 2007', + updateDate: 'Wed Mar 14 11:01:05 PDT 2007', + accessDate: 'Tue Apr 17 10:20:33 PDT 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 09:17:20 PDT 2007', + updateDate: 'Wed Mar 14 09:17:20 PDT 2007', + accessDate: 'Wed Mar 14 09:22:06 PDT 2007' + }, + 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': { + header: '####', + data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg', + version: '0.2', + creationDate: 'Wed Mar 14 08:06:54 PDT 2007', + updateDate: 'Wed Mar 14 08:06:54 PDT 2007', + accessDate: 'Wed Mar 14 08:06:54 PDT 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 10:23:41 PDT 2007', + updateDate: 'Tue Apr 17 10:23:41 PDT 2007', + accessDate: 'Sat Oct 24 02:11:49 PDT 2009' + }, + 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': { + header: '####', + data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC', + version: '0.2', + creationDate: 'Tue Apr 17 10:22:08 PDT 2007', + updateDate: 'Tue Apr 17 10:22:08 PDT 2007', + accessDate: 'Tue Apr 17 10:22:08 PDT 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 08:36:20 PDT 2007', + updateDate: 'Mon Jul 09 06:10:15 PDT 2007', + accessDate: 'Sat Oct 24 02:11:17 PDT 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 08:51:02 PDT 2007', + updateDate: 'Wed Mar 14 08:51:02 PDT 2007', + accessDate: 'Wed Mar 14 08:51:02 PDT 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 06:10:15 PDT 2007', + updateDate: 'Mon Jul 09 06:10:15 PDT 2007', + accessDate: 'Sat Oct 24 02:11:17 PDT 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 04:56:43 PDT 2007', + updateDate: 'Wed Mar 21 04:56:43 PDT 2007', + accessDate: 'Wed Apr 25 00:59:58 PDT 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 02:26:44 PDT 2007', + updateDate: 'Sat May 19 02:26:44 PDT 2007', + accessDate: 'Mon Jul 09 06:08:39 PDT 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 08:38:54 PDT 2007', + updateDate: 'Wed Mar 14 08:38:54 PDT 2007', + accessDate: 'Wed Mar 14 08:38:54 PDT 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 08:36:20 PDT 2007', + updateDate: 'Wed Mar 14 08:36:20 PDT 2007', + accessDate: 'Wed Mar 14 08:38:12 PDT 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 01:04:29 PDT 2007', + updateDate: 'Wed Apr 25 01:04:29 PDT 2007', + accessDate: 'Sat May 19 02:22:01 PDT 2007' + }, + 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': { + header: '####', + data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5', + version: '0.2', + creationDate: 'Wed Mar 14 08:52:12 PDT 2007', + updateDate: 'Wed Mar 14 08:52:12 PDT 2007', + accessDate: 'Wed Mar 21 04:16:29 PDT 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 08:20:58 PDT 2007', + updateDate: 'Wed Mar 14 08:47:01 PDT 2007', + accessDate: 'Sat Oct 24 02:11:38 PDT 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 08:45:40 PDT 2007', + updateDate: 'Wed Mar 14 08:45:40 PDT 2007', + accessDate: 'Wed Mar 14 08:45:40 PDT 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 08:47:01 PDT 2007', + updateDate: 'Wed Mar 14 08:47:01 PDT 2007', + accessDate: 'Sat Oct 24 02:11:38 PDT 2009' + }, + 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': { + header: '####', + data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=', + version: '0.2', + creationDate: 'Wed Mar 14 08:20:58 PDT 2007', + updateDate: 'Wed Mar 14 08:20:58 PDT 2007', + accessDate: 'Wed Mar 14 08:43:46 PDT 2007' + } + } + }, + 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 05:35:58 PDT 2007', + updateDate: 'Thu May 10 06:01:21 PDT 2007', + accessDate: 'Sat Oct 24 02:11:31 PDT 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 05:35:58 PDT 2007', + updateDate: 'Wed Mar 14 05:35:58 PDT 2007', + accessDate: 'Wed Mar 14 05:35:58 PDT 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 11:24:49 PDT 2007', + updateDate: 'Wed Mar 14 11:24:49 PDT 2007', + accessDate: 'Wed Mar 14 11:24:49 PDT 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 09:41:15 PDT 2007', + updateDate: 'Wed Mar 14 09:41:15 PDT 2007', + accessDate: 'Wed Mar 14 09:41:15 PDT 2007' + }, + '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': { + header: '####', + data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=', + version: '0.2', + creationDate: 'Wed Mar 14 11:25:28 PDT 2007', + updateDate: 'Wed Mar 14 11:25:28 PDT 2007', + accessDate: 'Thu May 10 06:00:47 PDT 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 06:46:36 PDT 2007', + updateDate: 'Wed Mar 14 06:46:36 PDT 2007', + accessDate: 'Wed Mar 14 09:40:01 PDT 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 06:01:21 PDT 2007', + updateDate: 'Thu May 10 06:01:21 PDT 2007', + accessDate: 'Sat Oct 24 02:11:31 PDT 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 09:43:29 PDT 2007', + updateDate: 'Wed Mar 14 09:43:29 PDT 2007', + accessDate: 'Wed Mar 14 11:23:51 PDT 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 09:39:39 PDT 2007', + updateDate: 'Wed Feb 13 06:29:04 PST 2008', + accessDate: 'Sat Oct 24 02:11:28 PDT 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 09:39:39 PDT 2007', + updateDate: 'Wed Mar 14 09:39:39 PDT 2007', + accessDate: 'Tue Apr 17 10:09:44 PDT 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 10:12:39 PDT 2007', + updateDate: 'Tue Apr 17 10:12:39 PDT 2007', + accessDate: 'Wed Feb 13 06:27:04 PST 2008' + }, + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=', + version: '0.3', + creationDate: 'Wed Feb 13 06:29:04 PST 2008', + updateDate: 'Wed Feb 13 06:29:04 PST 2008', + accessDate: 'Sat Oct 24 02:11:28 PDT 2009' + }, + '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': { + header: '####', + data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=', + version: '0.3', + creationDate: 'Wed Feb 13 06:28:28 PST 2008', + updateDate: 'Wed Feb 13 06:28:28 PST 2008', + accessDate: 'Wed Feb 13 06:28:28 PST 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 10:11:33 PDT 2007', + updateDate: 'Tue Apr 17 10:11:33 PDT 2007', + accessDate: 'Tue Apr 17 10:11:33 PDT 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 10:43:29 PDT 2007', + updateDate: 'Wed Mar 14 10:43:29 PDT 2007', + accessDate: 'Sat Oct 24 02:11:19 PDT 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 10:43:29 PDT 2007', + updateDate: 'Wed Mar 14 10:43:29 PDT 2007', + accessDate: 'Sat Oct 24 02:11:19 PDT 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/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js b/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js new file mode 100644 index 0000000..e805e34 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/dragAndDrop_test.js @@ -0,0 +1,128 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.DragAndDrop'); + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Clipperz.PM.Strings.Languages.initSetup(); + +Clipperz.Tests.DragAndDrop.Tester = function(args) { + args = args || {}; + + Clipperz.Tests.DragAndDrop.Tester.superclass.constructor.call(this, args); + this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + return this; +}; + +Clipperz.Base.extend(Clipperz.Tests.DragAndDrop.Tester, Object, { + + 'toString': function() { + return "Clipperz.Tests.DragAndDrop.Tester"; + }, + + //------------------------------------------------------------------------- + + 'user': function () { + return this._user; + }, + + //------------------------------------------------------------------------- + + 'run': function () { + var deferredResult; + var proxy; + var cardDialogController; + var cardDialogComponent; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + + deferredResult = new Clipperz.Async.Deferred("DragAndDrop_test.init", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(this.user(), 'login'); + deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { + cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); + cardDialogController.run(); + + cardDialogController.showPasswordTooltip('**********', MochiKit.DOM.getElement('Clipperz_PM_Components_actionLink_63')); + }, this)); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'saveChanges': function () { + return this.user().saveChanges(); + }, + + //------------------------------------------------------------------------- + + 'hasPendingChanges': function () { + return this.user().hasPendingChanges(); + }, + + //------------------------------------------------------------------------- + + 'revertChanges': function () { + return this.user().revertChanges(); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + + + + + + + + + + + + + + + + + + + +init = function () { + var tester; + + tester = new Clipperz.Tests.DragAndDrop.Tester(); + tester.run(); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html b/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html new file mode 100644 index 0000000..7cc0961 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/CardDialogEditing/index.html @@ -0,0 +1,133 @@ + + + + + Card Dialog EDITING - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js b/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js new file mode 100644 index 0000000..dac8b45 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/CardDialogNew/User.data.js @@ -0,0 +1,977 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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: '0/BjzyY6jeh71hwgASQphLMgnLz6WJJPg7sDskLKo5gCumpebgHBPqN0OPyHqTq4Lyt7Um++ckx2VA4yoX4cojXC7FBnscHtN18RlVNRvkfhhFPWBZhFwuVZxlFNb/IueDSjKR3dJahbTqao2AU3HXp0xOdsO5Mb2CfMz1/C4rtDuv5ee7GJNEv2hb2tBTzxbB8PZ/TKYZhlfgV3rJ2Hc509OeX/PuD8oYB7sUnB9UhDZP7pVY0Vz3LP/dFUf1cPGFh7bnxxYNphpJ2SxhIUdgxpmP6UCFxdLbCBXv13+7OlhCaO2eGfsO4Qch996otkSrVxfTvOTLuwiwSqU7hLlvOSzm9in69Rf35ZC7bKcZIdZkTNPeV0a+dR6j3LY7dBvIzd08OtBSqOdQqo/6isG8vaQPLVcWkFFZ//iHGgjTIduSoyzMb/y9cr8J1Qj1uTayUVAHQywCYdKgT4UccLoyt96vKHRcPCw6iepEfSrc3aZOtTg/aS3j2CGTih0i0gfrA4EbeQtIfobthsbTF6Oq5xjrIAMv2LRiJ+8JPj6xw8ODvM8SUN/3UxlYKsqDpWOW4tOztQAMSijoGtBswIl+mLr2p50Cul4n8ENfrilyAX4AcxUFSbH6tVd19ErQLsj+T2H5qhIF0Ifo5NxL9bj+Gx/5ul6dGH6Et9dvaHv+CZ3FKc7wrvItd6GXexc0SC16VfEOUps8yBahEHvNYAo/r5UG+wDCMhstHzEjiSV7TJ5ozjf+C2N+5A81TpJS+zfXhuiyupburyjYX8KQfXSvc28FG9CsgD9u9NcUuqC8L0K6MTB7k8RPSrG9xcBowqFDaH3/afLBsKWHEx87TiaZ7GbxKKmiINJk833pNZMYt36dr0fT0AH6WkvD4iSIWcFjvAHrW0CUBjOkhooAxjLDwNS4xBcgL0uGf61ygYBUH9zV+JqC3pullYzc7gL6Z1uKTdB9+Rzq/1NfZGUjVrsIepYO6k3Jf2j77qRNofSVtLr7VudUv297mIypV4jFNG/RoPFtQ2WSbHZIYIVepPCqWkQQ3VaaBZd8NToEYPjeSP7FQCrIjDtH5JVc649wgkEHdLS/q/lsToyCQh/47fiaEU/OJUX6UrzLG50J8+b+ijzIE3A3hZJf6nBnUbcUsEN1WzNHama57tMsWCUoxfcsZjEeSk8CzUjEFvxToKpESwRX7jDS7uWyRjuIHE56nuy7Rhzy7kP3hjE7eZQGMA7h3yxItDxa0hjvUO46IjZpmfyLIftSd323J9K7y9x3q0OGs6cNMNll+M8eSwHgooJbAGYjftIYVQ7t3l19LKEpnemXuObFFJQMvu6KQFRkHS3A2OROzC7hy3w5nSZP9Nqvygvc8Nj5x2IlHlK+pZeQi9E9WU6mGKIPzAOjSZg1FRLULUmahWgXGvJVIoVbHL1WX0/+g1BVsVcEZEAviRczTaFYVrH3zUIb0hql9p5EmHXwINnWMpbL1oh2LEsOUIpRCzjeBX1om6QCwyrXKzE5WkKcsQ7WbVvJf2q8Vdj3r3I8D9Kr+a7QqnAKm1GdwS+e5PcapxDzyhIAw0AsrOyWpIHFKvoJGl9/CWiD6Q+WxLDjG/KC3ms5P6hxY2Oxyakmmp0JGMtSIpOIV4cUyxfnFQ0LVX+vcrM9DpwZNHYLfyEVgg68xpLkUhUSHqYQhHgMe9oyFrzjmnU+EAzBY2vn7ZRrzxEowFipZpmlxFb81V9KRLT2l+3sUZ2yym7Y81HNdY4u1NKw2a3kwNryk0lID5FlbqvswxDJ60aWKFl2jrRW+EUoAX0mmGLk4lw1TYMKimngJap2ukwFky5/yn5KwCq4GjTkxzD35A52hFbDq5juINpyuFKb5X6sTkzxmIQ6d+1ePO6+kkN5RrZwjM2022BDoKJ95OyaR6kqUsIikDrgxHQUD6LR/2RMZapGa0B9klNlPm2phmQtAy3HLWfByXxRTHv7CP0keJl0f43LCHx/XPglb+QCs7mkgBIlp55xWugdKiBgMxzBkpjYWIXaaRkJcFrd8VmAwrXuRBvxVFzXh9/jHxuUMYv4WPaNX0SIhiNzaJsQCj5GRc4ftGD6Ot5rOaYjOxVM4yiFRzJMCgjCJPkL8EkU4l3M0GP3udgCfVqoHVFAAKmgdHB4o+hR4F8JA8U9+OCAMdZ+U0TL0oCcZPvQqVKi0b+5dePa8xTLYzOAuO7KF2TvKIujYqkumvg3zauUxxq7Ncklv+ddruQd3KAJ+H7rB9+g/6mTUpdyhNs91BD+QO0q3AYqmtTjSb6eJ2cmz7h6hA4xdg1Pel/sn+B3dePy7BVXLe/G2p5W34L0ZItuAJlIUo8JqE7IJ+BDJ2HPHMT4t/QIde6A76LDvKzalpZ5k5DXwnwGIj4DUdMXgYB8GdtTAhusOraNCNXTCyqU+EchYrO6o9UOURzd8wWj49jce/XROvWtKBuVbAXDNZzcIR8ALmpNTJKv0fz2Y/9/yxxvKN1dpBkLj+MpAw2++NEyylGhMC5C5f5m8pBApYziN84s4O3JQ3khW/1UttQl4=', + 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: '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', + 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: '7x7+2tk+I8+OchrmpfLJhDR2crUWfHDo/E8TdmVxbMH9fsnqG4azJG/xVbWROw8N0v8ahhBY3BJG9de9L6PH9B+wECx9zRx/udStcStKRpJLCcjWxVVMt/ipJ+/QqFKWZptqs7VkiT4jZw0V3I4Tl7Wt82/PWZ/euyzYOau+YtiflSedG7+7aEEbhDblntf7NbSXCTIXVnAZw/xuyMjxmioJNNe4sA+fls8KZSYYAzpvxl9+h+esPm978SN/+IuG3mDzCHS+V0tmEhr4v2yfWsZ5axAZFjQSu6TaLNvdFmvgF2olddkizXBsov12WlMSQDSEhs/xkv5ZXVLK3JOCDJldW80eLs0vGOSOJZL3r7NO1gRiwnX5K8PM3YowFIFkWNavRy/B4RneSNCo8XqEg8lBBiJbTtExxMByLKjifcKP7xAD2VeByJ0XDo5If+J4fGiYjo9XU/Bkc2POnJQt+SnNN5iAw493AtGDdPMO37RFRCAeU3W0vR1unsaD9Xn+ClPj1jNCXWZDtvwWnoke8XCeDeTIAzh3wXMCs7ZRqfAHwA1UWOqIq4DP0RJaWeIXCWYSRYAWLnteX1EzHixkvh4MMKmA09bbH/SS5gB6P/V7BBiwxKgstU3tyBbA2bW8aUG1zNthaOtbVqj9YbyogEMN5f3r4I0eMAZDKkbD6med1bHm6P0Zlr0MIYFIgiLkZvEjfoVkuQmFpM1N/PAlEeVDD97VZG9bGN006wdIsR2TEStymt4aBTIyZ+AKDKiGAARYPyYBTswPIAzKBfUipJ7milktKHHmj6LdsDMrwIf5ZQLqvAm2v7xMMBLWTJI+ieGi/R1UgvKAzyGQwzQFB2x+ljNQHsC3wnTLm7/y87CE0FB39FZVC2NJETmWUmAmltL9CPs1Wr6tkin6e2CzSvf5EGsKWBMDkHZD08vjLd30+BxbfS8cuWS3BpTzZ481qjqsF5hDtyRgHQ2eXXggc9imQCvNdG13yNOCcN2KUMPWvPhik6pV7HIMPI2ncPegtCVYwfDFHCn2AV+K1j0G1JIPzRxPlXBX/XNK9kyyK7R3xO7vC3VQyMzPGp8Br5vmoP2356lLLvR5JT7j/uXwZTP1H2/cZSLOii44OXiSNQ8OKp8SIzcWpAd+IuQ7zp2TKOSTl8IEbnorNnJdOG1FbT9kF3FlWkjT6LmQM6Y6pwsYPWinjth72RpTTMBAg6XXr7jveONdFOhoQBjD+VDkF5mv9MqANwv+1HSxwd3SI2OuTsoUcaHzpvquixf6BF2mctDX70i1Nx0gsnBzwsAa3hMQ924fEUyt2XQbJi+3HJ+C5qakgfZ2ERq/MaUL3aSUEL2ViuBly7ObM9/E9NQKyRySXGXb6e1ZdFlajhWLw/N4UpZQVXuQOX/0i95lWQsGbc8aeEn5kh5+Mwruxh8cIBVywiet34O5smc0bdoSWgXdaHZZ2OhJpP26gcDmsYQQPhUUpkhdipRTuNMoWDpy7T2Z36otFZYSRY7tUF7Wmh4zcXxgm8nBbxD3m63ll5MQXIfsR6KL+Ai+81U19VEd224+SdtHd8LP2kbQTRzNvDI2HJdw3GRsdkhyVRFR2NCdoseUfLGqOVxNt/XiWha8r70JOBpe+otSStF5pM92FHHsLqPIEakPqaEXL6IYJa1C9kLjMTjmQNig/biF1X3vQAne1maUvuAGx+6sdUU+GNIpw+AdjilUoRLsFwIMiwLxQLc4dY/97AEdbaC4pNYFW80ch0Joq54IYdmZwv4A08mD7yDGuWxBSyJV4Ylo9nI5ZofpW4Bw2HaG6L3Qx+207Y54WbYjZvmPUdLjItjQWgbJVPfvYi18zaqfbHFulrhKk4MM12oc0OBqt9nl6HHNKHhoHULDMR3B09B4luV1uziY0JudV7ePlCaLd3BDF/y1ujXFPJm3GLkjsaXY/rargrHuiIgKz1FJPuEXKq9admZmS0YgsGkRAgP3RwxpwJoCBuvV1XsFAYJNnz07VjaGvtTazGg5tlfITyF3tZ9m+GAeWR7dObhBOIxR60JddSz/61Zy95BfUOgpuhXYaVuZNFVxYTWcsDFy6Rn4TJN36FfZ6SaNiDQmWK0nhXiphNAzFTDvOBCZdXj0hwSNibD93fMrnphbjmpRfuhLk9MVLupB0FcuW6gGcJENbLKHaJYzRk1LTqXkZ70BCNoSt0HHUgaxj6S0gYVgWa5iqB4HS2vB2gr3B4iEezUWYG5gZsbCcC/H0bvPsSiNpelHrApPgrhGatR5ZwyLt9tnpVTxq6Uw1DkgVdEYrVBUftA9WB02R/cPD0T4K3VqyEaixODGpRWj3RcmUlHT9LwTlVmX9zABKxyIe6Zaq1Chk6mfDPgBzgai4yoUlLQulgayxG3GFc8oZRAm/kOjsY2E+/OpVPtKGzPGR7i4dSK+c+/GTJZykDu6w5FGznNo8YYKB6fvSi0nsTdUSBxBcYgFs81Lkvh/iBf3ZgA4XT9tvHls8VDOKHS7Uz5B7yr13pzVUDJLPQnlbDusmiAKgoloq89ASV2XdmUB50RxeKk1yuMfSVNqXSRxHB7xcQAsnJKaPTvkc1Dikv0K8g6uFSOlN6PXqOJU5SEwkDVsG7OBAWw9aiRC+IKwquOvzejh1Cbu11yMYlPpPtSydMoOEwAKoeoT0XdGVDXP2ySOYpVuW3i8wceWQLg2BYHIlWUzX0CIN0HZbvw5v+ptTzDXT+tp3AtlRzmGKXRVBvdtyUn/38abZ/Qwm5Uzw2jtXc0ol7ce9SMpJb83wpJbQGVTrDUrevFw+vh2x093yS7xNRJS+XNKnfZVG8WahWTdD2VRilgQ/GNILKjAT22XC0kW/+MxBReazixYCMU/vp7fJ2/2i3Th2X6ZlvzVeR+0jd1lp+Y/8//iLFpNn/WCkIKZQk1gVlVlzlY889hORm/SJd2J08ODQ4qCJS4ncYzu/xxikyjd2q+9wb38UHIIOx+qlop36QXaCraduzD5ZO2GHKZBWlJG0nBWxli6BMc6CIQdTKAAm3xnDP0wsIUPhey4u2+HoqC+znZeXTDVwl9n1oxzXsgpHsUlRCHG2pUGF/nGGe/r6/PQ3viSz5I5XUPWy0yOoy6I+NYQCanjcYtFvbcNTDrFmIkQPpf2kFslGlfINGgRlLTIjoYcSx/Xp11FGGwG/1tOKuUzDUAY2dMmFiGGkkxlHL71Z6BFAWj547krybEyCujhtNDCex8htVlI6GH4RxoVyBmw6cO+LV6TO63ieZWrFJGyQ0hd0ikh4A77NZi4+0rEsa1nC4DBm47z3CiLsXH+IlPi3MiBKUVb0MGHcLSvDokCZ4iFsdaMx3Cvkne0Ym8v0i8ImhWa8oJzmC7VQBSCs3gxCs9bENWShhlPs8JJId2vpn5LzsYp913gtD4PthRUGUAa+9cPzQ6V4qQgpzkX0KmV8VRbElDlR1Q4FRC4Cu7ULf8YTSof/Ko2I0iJlH/EmtM+BQO+zf0MohRvDPzEkKeHFhgbUSjcYls/NWU5oK5dOdbP8Sg2AryTySVmMiJd0Eefu6YnjJaLS3++mM1tOHKucCStqhehFL/Jo63qcHbe1jGvAdbKHk6WVHn4DX3DbT3U1awpfEVHRxNG0/IWu/6G2RDx++pi5KcmBIp40gkd4Exv/k2BK/gFs1HXBt8OXS858W0yWDsAl6z9zbzg1JfUvmrfhFLMNN5jls0AITqvo3rHaA4gVUjswUJmsJdElncyRHkTYuE0lbr9Fv5ELkQePYfhyGwKKJpRYdtNZ2f54rAMy5r/Pei1pn0ag6m5jcYzzM8NVIrJSYwsHsghphpkJw7Fxtme8hgAMoD6lL4lGjC786IG9jsnmXnmV+Y491DDjCnOMTy/NTWm1RD+9vjXYxVaO46+0iYtIjk/e6cmFUEz/eGzphzglVXnAlBs569glfbuZrNriiGzd66Wq4lETelMy7sm3UUwL9n3RvGalQCuwxVLZf2oQdNRLnH1k8sKYJk1DtFNW8R3gTRyFQBx1FKYz5rtCKaobLQf7xn+Bnn4uBMtpVoxfsWnK7se3UIKutJuWH2PoetRft7fAcYzLSy9Oyy2fV2gR9OV+9p0HJAIPIKUMC8nVdLXXaggwns4cigSgOLN08gWpTlD39IZmBY8iA+l+bkJcDSFqD+T6hYTNxSXkSLy9Xve18tvYJqG4JvfBt7JwSdA+QwfiS9jIQdIWUs5cBl/ShX9IRmlhsZPF9sow5JAnGJNZhPBF0j9UJfDcgyw98E8wVuNHly5J2CneK1vigbZTM25KMnjevyN3PnfsFSkPjTw4wmMEJpGdMnzzVqA7etpitypyNbgjX0fsAWOgEIRQ5Sog498t6nF1SwWVy7R+0CdpZhh0GpyoNf2TFUklYRec+xRLbAZc5Bkj6Tm9Z/ex9Ssjhi23uL0XG1SCJbHrhox4F8LgLQD22wcnXoSTU4mPAY942u5o2nvB6CTQS8Mj5n+YipQ99UxDhii5UrliGHSdEgjugfHiSoxpkjhNxJSWErYOgWi/qadZqsB/FHLFfMDrhkKxjpcSZwzZO6fAtKiDM5teK6TWaGWwEutd/W/q0Px1vYWxnxHn1ryXx9O3ORe5JJ5FymN4SWkTBIC8eeWTUxQ3TSs2NoGPmN6SnpGFLZH2VLygpg56tE9nXJifXElP8TcIPGPvFGNZFLwtxcdoVbLZaS1IUTpExPGBQ6NUPH24cnWE3RoQrQQHaFcdE1+IRC3TKf+ajINV2LBMhdYI0yE5l5F9hI4GhHNsd/xzROx4NFqkSdVW6T0jFl4NhAUB0iSX2zwJ+yvaor69uzWIFW81n8T5iSPG7Q1naFLL6AOt56wLDUOkioi5CVYlt5lFEl0UtmFnM4j+/Nj+FCCo6jPil847/ZlAicGKXktmDG2nVGILKLe0MZAKdcni/RwBJnl6qSs5x6u2Z46HYi63t4c2RXlljJkHvrn9PuAIG4xSC041F9gaxEshFqg0+nZ5dNiza+DoWgltTHkJehK2UQLMAbRwyvURSz0zSwrUTuT1lBCoSR8/rP3M8PghvUQ6sHpcw1TJ7NwG5y9oS1UVKiU5xC9gHlsMyxfSEaySkhdD5tVOCeGmOzKCD+vx8C577HZaNskKN6KxB3o+DvF6KOAjrtWvZ7C7r1JF7COugUoBSGrp/CeXtvswFvxNc8bqGqEqEZehhl+4TnKrQ+M9LOyWYnkHqbAVt91tIaeNCZZT3wyP4ooZU+JbOogK50kn9LMeT3r7aqbYLY0T1KQH1eezt8tuaeHaKaMX8P7gpW3ucwTINqDlTHL+/wm42D5UfP+/8/jmD+OfHdi8riILye/fDH+BMbk2/syWF94/ZbxjSEWuNtKBEQZJS2PlxQvlqr5pwCcIOFfTE6afEzCjC8968aBhqXMmONQjiYTj+CGZAfivZQV/60o9ckLAXAJoFBiBNf85l7M8DBfmRyabNCQMldus0zvBX6tptH8EuGL4wRPC5vReeigzpcaP8zbjOmvv8bOY6ZgDZTTfXiqOeSwCVUABEUfErNIzGizNu7iYCrbrPqSErrSC/8EmCqyqVbQ9qcN1VSJSAOJ4Vo4udeib5Zvu2zG5St9HWO/blRkKM9qn9s9i6ONSvn1bM8sp20cvAM3+/JVLD5nlCEqVe7oQ+uBCGLpgFJNj6lHiOqSjOm2OSvIbXq53l3IETF/r49OAKYQP8FkVpxrXmQS9Du9Fbp1u50BY9eSmzJuWOE8rOZhNbpaKIpMhdA7HYRmq7hX0bzDUHfKt9hbcrS89fzGikdlyTFmD2soGEbAwgjb4nFkYpzROVAjOhpfz3loAgZO5qpiXym/ee9gus0+OO6PM1xPkWUrTA8mnKvfiFO/ZJx3rn5g5+M/llzj41Cc7Ds0GtbWpUPhLzY7icmtNBamZf/uSUiSHXi6GCZ26llyX7bayCIVUpjg6ijelZQU3rkq42lVPByq8zmxECK8HjAyff6StsBAdIIexA9DN9psACVvybb8iYd09R1wPPFz3o5Gl5tSNV4f2brsPa5VAUyQdQ8YezWXIwZ9u3Q9vrls20FFfN697M+/Y9meu3hX3lVx93LTTsDCLVipaTJyq65n6lbOWZMQb5dgxtoBEKL3ZuxfeSTLiVgbzF3KqxyKNw8MwiyqcVO5mgZGwK9mHFFbSnUiPfHxBfBdqYzH07OksNb9/MvNYK+ebVj5yrEwT/EjNP5/3Bhe5cRUE3m7Y0WgS0TuYZiPgNYCak7ynZXOrYkNjLpH3Wc5GC4RnHXvwpBtD4yJaiIVt0lxYPvfik8FaRjQymubWA09j78ac9d5bKq40ERYLE9oTOoot26jEKoNSX7xqGQCU8VwAOQhC1HfKfdJ88uFMENnB2WLFGqHhZq444eS3Swc1OwBn5zSxUXLNZon9pinWObX8O8ULY1N5TTY8Qh9bLLfLjntCqXFXH8/6wcdnuOrBH0It6LLqrUm/TehuqXXL1c9Q1cYBLYrYjT0FJmbKrcyqG4peOxfCqEiryLLLcdSOECA4vDSvlo6eJ1sk1mXgF64ZEIIH7dZWlOl/eL0L6fGs/vrbvJBBArkVftkOiumIsXMwqaNtZYwMzX811NZpFMOhInwTmh8mbaaCpL+0ioizEE1/is5M9eA3808sF3Miv7d2RtI3sGWbdb9K/cVrOhV4Oy4MkdVxrZpeYuzshod3DRB3/Es72Z1ImrZh+div/GnWpo9Q9M9U/pLVuLnKVCPnXhu5dkF9nVse5NrcBlt7qQvvr/4CC0uctQ94nbjNZobcEXGSYZ8dx7Oftr7fKzT9cxhh93Zm/mxz48dys3JD1JB2V/OZfPoiiMIEW7r/0aXQSjDhp/v7QeIL9nLT/NiNUi5puti/t9q/GDK+pj6UNQak56M2//iLQ0y+3ov9Fod/LJAAVnCgMAFFUX0AJ3nkRPT6Rz/dEtbKdmnVqUER6UzDvhcDfDV+OiMmSgVFZ43d9JkuDPTu5Zuk2J12kgxddjbbSf8Z5TqkaDPlz7OMCdEht6wyTt7QEX88sUaiFrRLgvGxm3BYv6FZ0FGWfKqEgqjnsFJkmIYPYl2jrAC20G9LE5T/niONA8V2wT6S7Ha0xXNWUk6xaWP64SVOFvRvG8mx9fstjLCMhRYGmpol5az6XSgZ9Xd+JzhkoAWc+xmYMrT30kw8LztcWEz1HeK+cktGYS7vB32fG+oM8MMz6bVtkouHiGVE+YlELr4GjUHrnWgNKqtrkL5btt8ceZqI9RjE9aUqN3KgJgAt8YselJLfqFHNu5kh0XQBbD8CIplN6nzaXTcK5qsboyNRAEC7kjzp0iG3vHqNSPvGlfqCKYCZNW9mPpFaTFPQoEhttDp9+W9cCSTeObdPTKe4n0a4CkLNsZ7mZlFHN+7BhJcPa5E/e8P14xJ0E5200RKjkv/+jXxMEvlay0xypHam6Bw15RJDW6vW2O1ZvBZUDtlrpxXf2YpfhFP55WGVbfiVcsQfQTzJkzmgBleS0lmuO7k3s/11XcCfpFSe2aLGA52ClXXvFzSeKFnrZ6gsa4vfX/8bnLQwZDB2btftzgoHvKRTQ9tw/fdicNck/qJDplSW192y/66bqpm/qKFqt8nrx1FfivIXZnqR+YpcvJuZWkp+uT06Jy5oDOHqjmKrQkQoWmQlXyzTHJSIYjK0pfwAV3X09uMYI7+tsR98K6yXNUmYYR7CC7n5m44eu0Gr3fBienuuXFTdbrQvaVHQsY+ekPWByR+rfhVKxoK7cYOJM14faQlpMfrrOtPSJ7yABcCyFRmcaluNQxUIx/ueC07TpbP1oIVhRrBpFPfmUuh8EhWsMqJOrZXvJ12pPrNvSWaqZ7sgs06NNob5iM0YsNPDMYtk7he0ZxwD2Pjh/u7w7X1CyGRJ8iFEn3xihuJzCkn9UU5toSt2jYA98IW32VopPuhqqpBk6sv+Rfs0HvSltGSF1QpbmAEAOrpv/jHlIrT9KhEXXVnQn5uYIMM447o0VAODIDP0UxGmUkRBCZs9YD/aMSaaqjhFjkIXCRIx44G1hMiyJMY1hXV1AVpQQPc61qQqltlXCJShzeDU+eIqeOXKLKEvHpSbSdyC0m7BSjet/2s6Mdwp/JuIft4oUCMF/DoGYGxEo6mi3OYUM+xBpep7iFAY1pb/DzdqHUn9NxwPi6C0OMxU+jaw2733LILmAcE0jFSJyQ4KpeCGubNWjMMg1iVPWtohYbRUuL8Hypq0d9QD2iJ2a6OLnU33HnolnO7VQKSIrBKMMeJZlPfptnytn3CW78xswDIGTsSLYFcbsNL2dj4f0ZU3nUhPy0XKqfEB3DgDpiwH1tdWrpWEaHgIEZWs7HIwSDb69K2kCDTnVGnb6hXSL/k4NvW2qHyTeMPYyqSbK4xwDX37UJMZbA4p62j4mDYa06tADbLsjr0PcLs1hkwanvZEcFz7fo/5Mf6n79QlBsjRyy6GdHwbUF8REbpQUY2j/lF38bz9cz2qwm0OpmpkX8eu4DGxsMZ05ycUk4WdZZv5zCpOV2oiDAvTnxQQY/j3A1wxjklolnjWWLRELaXae1z1KcHzlT+kro0eUIoqSHIbbnhysYb3TYLtllIFR5d7BzJxEirjoyogpnkNBnEXfxzqu1RjvNB1NM4fLOnnd0RmIjW6o7ncj0VY+wWsVVpIiybGvd7eFPftTii+zHU/eOfLOiVLEWwAcN8qQL4GpWC3fKNXBO7cW88YxMhE2SA+aef4WLYlg0y3S/tdoo4V03iSqgbvUwrI6sfcT8biJD8XG95/7MxD8iLzI1Lmj1lg0crieRctFoHel8fnZfOZyN3PkIlQUQGe4q5YG2nMWShtbJUqUs9QF4MuvNB1Xqel9mqzXzfkYArZ33+W6gBn8uMRTiH/uNsdAts3i5CCiScNs6CGXmD/IkX0G17EuHiHi31W2xHq921SRy6VLSM7MuiUmP8HWisDV9Qih8QYA+QI6nKbFtISIDgdLKR4nIjbXbW7FXcr6lu3ujvrAsK+o+O3rWEPhzFwzFRFk/VdwP2BJ+dthGHsj4XxxiZOFYGP3TahTy861IL3ZPbKPLFT5YVx5R+b6z+zaAdEXbE97xP74BJPfTaXR2X3k/rczKgt3GAdwYTHaJ4PMoiJyQ12J5nztQRo7rZdZBMmMqSJcZH1oyPGDCgBJ3nzXbS5F9FLqIbjaA6Sih5PQ6e63j3OucsXZmYU9nA6qQ7fG+x496RsvmvxND0CX+8ryZTbhXDuQoMBPEtY7wXQZegWQRkkrBmnErKEnmxDokiMuyh51z3dJOSYIyHYOfYFR5DAOE+ikEB/IWVva2WuOv+R670WwBRP5e4TqcGgZBk4ppa3YI8/jEqgVP8urL6JBdT0GGwcMwPPxdbvwFPUA8NQq77D01w79w5gJiv2ZXt74iZS7i5TS6yLvw0G/CSP/PaJ291m1Jh4/qSNpBoTEFOrUBhuTAzrn0MsAuuvnPwOnynwh850gqhXmtDml+6JwE84aHwSx5D34jKCUZ+TAtddczIQyxMg1qu7g7WhZe+WCvrzYgW8ZLR6dk7lS3/vXP7mMU6X46xKEb5YmakuT/FTW3xASywnE5+NMAtOWTxLEY60/NiqCVeqI8BPL+9Et5Lyw6di1DlF9Aa4VCqaOGLo6e6/9NlnI/QnFy0kEVxQmOVsRgf9k9P9VAHXMWy4vM05O6LQ/EAptQgFEkRvG4ZKQVcPPM68jSWMqoDdTqwPvELiVAT8K5ZC/OAVqOBqNbMKCzCK92quPV8iiBUnj+07IR44v65BjTWJOUR3f4tm5h4OvRdf2I6rW0RErwXeVLwI58ADfNh1ZyqMua8E4MTB3p7776us8lzYYSmdWCE9GZqY/vQUb6D5F0jO/W5U8ux0Pxqa3ORckrp99RN2vAqviwqMM67CNyyIJqO25kxpVxm4pvCf0h3KX6mzblooM4VFZEMpBREU5FaXTvNDIP00oFCwB+zpENLXLxfaNAuVemH7lbPiA==', + 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: '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', + 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/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js b/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js new file mode 100644 index 0000000..e2b21bc --- /dev/null +++ b/frontend/gamma/tests/tests/Components/CardDialogNew/cardDialogNew_test.js @@ -0,0 +1,127 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.CardDialogNew'); + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Clipperz.PM.Strings.Languages.initSetup(); + +Clipperz.Tests.CardDialogNew.Tester = function(args) { + args = args || {}; + + Clipperz.Tests.CardDialogNew.Tester.superclass.constructor.call(this, args); + this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + return this; +}; + +Clipperz.Base.extend(Clipperz.Tests.CardDialogNew.Tester, Object, { + + 'toString': function() { + return "Clipperz.Tests.CardDialogNew.Tester"; + }, + + //------------------------------------------------------------------------- + + 'user': function () { + return this._user; + }, + + //------------------------------------------------------------------------- + + 'run': function () { + var deferredResult; + var proxy; + var cardDialogController; + var cardDialogComponent; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + + deferredResult = new Clipperz.Async.Deferred("cardDialogNew_test.init", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(this.user(), 'login'); +// deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); + deferredResult.addMethod(this.user(), 'createNewRecord'); + deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { + cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); + cardDialogController.run(); + }, this)); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'saveChanges': function () { + return this.user().saveChanges(); + }, + + //------------------------------------------------------------------------- + + 'hasPendingChanges': function () { + return this.user().hasPendingChanges(); + }, + + //------------------------------------------------------------------------- + + 'revertChanges': function () { + return this.user().revertChanges(); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + + + + + + + + + + + + + + + + + + + +init = function () { + var tester; + + tester = new Clipperz.Tests.CardDialogNew.Tester(); + tester.run(); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/CardDialogNew/index.html b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html new file mode 100644 index 0000000..1e0061a --- /dev/null +++ b/frontend/gamma/tests/tests/Components/CardDialogNew/index.html @@ -0,0 +1,117 @@ + + + + + Card Dialog NEW - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/frontend/gamma/tests/tests/Components/FullApp/README.txt b/frontend/gamma/tests/tests/Components/FullApp/README.txt new file mode 100644 index 0000000..476aa3a --- /dev/null +++ b/frontend/gamma/tests/tests/Components/FullApp/README.txt @@ -0,0 +1 @@ +ln -s ../../../../../context/images . \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Components/FullApp/User.data.js b/frontend/gamma/tests/tests/Components/FullApp/User.data.js new file mode 100644 index 0000000..b76ccad --- /dev/null +++ b/frontend/gamma/tests/tests/Components/FullApp/User.data.js @@ -0,0 +1,1044 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +testData = { + + //------------------------------------------------------------------------- + + 'testData': { + users:{ + 'catchAllUser': { + __masterkey_test_value__: 'masterkey', + s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00', + v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00' + }, + + /* tt/tt - empty, just created, account */ + 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { + s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', + v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{},"data":"q/wNeY/xf7Sujn5CIxEYPRSF"},"directLogins":{"index":{},"data":"qcVwiiyOYeDHFZq5T06iF1Wp"},"preferences":{"data":"7ONKfKQk9GYGnlRxFgTgAd4J"},"oneTimePasswords":{"data":"GD66ZNSIqkRl1UxhwyrsSm5r"},"version":"0.1"}', + statistics: 'tfQF+BrjAQUWyiXWOMkWApmq', + userDetailsVersion: '0.3', + records: { + + } + }, + + /* tt/tt - account with "wrong" direct login */ +/* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { + s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', + v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"1"},"data":"/+RHG+JLrFhZLYga2H9hsPyugT5bbiPwmNgY/RqE2g90FXfsCOvJ6TnfHX6ufeVfJ5+jUq/mRhWMlKdIqROSBLRL5EbL7i881EyKMNE24zpzUWm9zN6HcATPO2iNvDjsZjv2dEP9QWtAabw4Hc7UB+39WQ=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":1},"data":"ZF6BZYAVIJi3xrCPs6XWHwZDveEonG/5WJVKwIXbCGa5fr1myopvpqYbWI09tPCCktlMKP/X/SiIyBxlq7Z953VpOHWx0AYqTpRnw8PfJ+0BJDEblBFCZ8ZZfkZXcfYmNoY7"},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}', + statistics: 'XhiWkdDyHzuviv5bdxOY/2Q5', + userDetailsVersion: '0.3', + records: { + '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': { + data: '93QXl+c+JmQo4WTl4rYLYb/oHehjntAroteeHd6HqrUiXYoi+02GYrYcKfvE5wgMWvOwvQ4kVdUv5ksa3gJaUzhrpY5GLM3EV3agEkQ6yuKwHgfmAQvES1c6tcw15lNTzGiZ7PHhBrW5I5H6Le0Mf10uW1DOyu6gFl+W5OarbBBGyQmRmASy+CW2l3/lY5pOFxUq3qlkwW/o4KrSiwKOFh3HDvxOQKwovm0v3puLu+NsuL5rz5blUIZpj+CsOmZUhtU5FC5s6iO2L1uj3w8+Yxu279p249H1bv1zxo1zSBpP507uuRH8dKOLsu7JI6PO+UC8PLqVhPU7fHhDhNleurE7AsUo6eHocG0DhxCAm3xeobm1K2iPd0iRprcuRXmwa8HWRDJHTItbQr9D+cnQTT7/DwneRdQzpMaVZHZcKqtAzz07jboy98plrigu03tV2MkXt2veIMLBofxxHqgZ0NJhcfrVta4FlJsrd1vO9RUkoHl+qPJqQZIVGZzoT0rdHS/nLd614EHJSfRYIl+drUEUchIidbRnMzvPTBo2s6bVfUPcQksVop4E85wMo15ah2BHzUe4vjkmM+Ki8ecUVH8jRR5fmZhCGpBFML5U7o+rERYABFuwwRC9FfCXMtmClHc2LypP+iu+lI/VycdHg/m8skQVeCDBv892vqehUs1CpeVAxMtYOJcFtm6roQNPxJe1EI/j4PAi3SEYPCFev1F7u1g4bw4cG5jCGJx6U3qTTYMX5A06dHf4iSSOUeCsrP5U+VJY0KLhU3E66DzOxNIrIyYN6iOJxKCbhH7ILfGdWAV3MlZZOpVoSIqiR7oZo2PwovtudF5tOy9lhz7SEFYLvuQy8r4mqFC7qMVnXJRrBPDZcQDTdXLG33YV6dWX17QpGrpyvPhX5/UDv8E7zc8PdO1YfJmzL1rpArlIXF1EOsLa6BqjQp5bkIlHKugQMjnn3tf4sYK0OhPskbKidfNm59NedQODEoUr5NGwmjSAqTCokt1D7q0K3vMK', + version: '0.3', + creationDate: 'Wed Jan 20 16:53:47 CET 2010', + updateDate: 'Wed Jan 20 16:53:47 CET 2010', + accessDate: 'Wed Jan 20 16:53:47 CET 2010', + currentVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741', + versions: { + '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': { + header: '####', + data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv', + version: '0.3', + creationDate: 'Wed Jan 20 16:53:47 CET 2010', + updateDate: 'Wed Jan 20 16:53:47 CET 2010', + accessDate: 'Wed Jan 20 16:53:47 CET 2010' + } + } + } + } + }, +*/ + /* tt/tt with "fixed" direct login */ +/* 'afaadd70f647886043b9196c861dc04f5605baeab3812ea23707fcba08c4a54f': { + s: 'df781ec363a380a0bb171d7d4c226248259272a964f04fa2340c77ff84bbc594', + v: 'eca214d990ec971a61cd9c5082e62c2d241f8e1ec805a2c26b1d31612747bfb0', + version: '0.2', + maxNumberOfRecords: '100', + userDetails: '{"records":{"index":{"8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab":"0"},"data":"K6sV3xYDTHn1PDHmbVhG3PogarwMtHCliSEGaJ5eev/RQv7MW9TCP5efsjATRT4eheX7JkXAoLo+sgMVr2fTyu7f7K0IEYp3mCi27T/TmtTM3b8FoaVfmXWEjN0FGx7N6gK6+lZxhFueRxsOha1+fTLDBg=="},"directLogins":{"index":{"dd9c1f84d06d67fe1ca5826b52bf46e56407e7f9d87fb7b7b927831920955338":"0"},"data":"9aUwb/5nIlAOPKz62xTwylK0dilpWVVEJBag5+LydmBwWxTmlfcB+OO6jGnMgDrjif3LVhWFjfKVSoZs5hSpPvhsSDPaLf5vQhF4igRaQpWI9QhBdfmv3QvZ57ei/gfcal346F4="},"preferences":{"data":"IpjYNIHTXtE/pZvR8TjotEnR"},"oneTimePasswords":{"data":"1ibPl0R6S/LGBFFyH9pio1Oo"},"version":"0.1"}', + statistics: 'GHHkZjW0QLdUq6CPnVuDLh86', + userDetailsVersion: '0.3', + records: { + '8bcad18cc9613d794ca052c02e91198f7d5b6e1b7d595f21b21ea53a72e56aab': { + data: 'SOcANZTLo4dsjpsPghF2+TndV9+1uYhGjup3StEa1kiFHHzDK6kDZkKwjhP0mxFgixlQHZBnvgsW/xdHGXdmj1RHtaNdHlte7W1Wq5MHbH4XE9bJzQAvQmop8OETgGz7Khp4BbUMVLIXhxoJmP3rMx7ulQHds+WN+S5u+iB73y5nkJwfOXrXDjwwlL1vER92XHE1VJZAjkYRB/xes6SLcITaG9LYVSGSVAhtLIzkmrAvPHPIpZSOI4NQnAMEVPllwtMlWQBEeerN7PIKImyaUd9zPzP+v0S1V+kUyioizScsDdVuaNKa+yqwFKvYYy61nobv3Mg+Fo3EGqY7GOiO7AklRTreZoOkZAdogQlA1DZuIBNSbpcMvm5MoP+PsU3HFSb/Vioo+QEcgTWqVyDNuFGZpkOI2iIBuQCwLmsCwB1JaE/1cCd1fEpOWyiFep0vxwi0ZrtRZQowQd2Ua3UIoaG5u5WoYEMYoH7FFi6Djda4Rf4gxed8rPLE+cNTI/p67OKlbAfr8iz3YZknaH+CXp9pPr7V7xXBCWNxo5DnFPeeqqrxjTAbkeg/Rp2hJeN7/zi0TSWKDUTXfkuUNyewHOHb7M+MIvC1F1CtmqLuU3h8RDINYgPtZTtTk68YBmOG88xYTtClr4kKxmp1scrV3nJ7af+IGoVKZpRAwBJYT3HV33vzO9W35zl14eZ0vVuNoHMNsh9uDxjCwRyPtQzVpQuTIYnHHoO5R17XyIfe599BOSBAGimciprURN3llC2H8YhRtMilQRYvEDVsC+mVZmGAeEdQ5o/AehnpBuVKErRBzotWe6bNMkIQqWfwCLQFBb6ap1gT5hbacrJM4AlaPgOdQsyX9npd3yN/tzjVA1IqWLnoaEXq9EfWXhBuT+juMfSQ2Y8bPbpBKZmWWL06T2fVkaZJN0VFtBXGi0XRFJngPskApLunZOfBYq831jSi8/Z937QVTQKWwOz6rLE8covE3mxJ53gDVcOlvqD9s/NGXbmnt2GnlWhVKpzhTIJ812Hr050/2AI9ZmWnv+ypSqeQ3l0BFh4D+xfk5NRv+dKbxANheZnfZMhR6u8F+jX/W3hUtNCIMQc2vLSQ', + version: '0.3', + creationDate: 'Wed Jan 20 16:53:47 CET 2010', + updateDate: 'Wed Jan 20 16:54:56 CET 2010', + accessDate: 'Wed Jan 20 16:54:56 CET 2010', + currentVersion: 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d', + versions: { + '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741': { + header: '####', + data: 'mqqGPhRw/397NUZH6B8XJW1y5rMDZD6u7WUuEU77zcNXYEHFNQq319u0G/qD5E63kbI/kHsNXZFFKmNGw5IxDiteWSfYG4RiiapsUxe3ZgsFDDBHFrD5NSrMdIzLFSoNel+1mZUps9AcmkelhkXSCqRiGPyiPIKq7wKXF+Ql6j1AsnCMOCJLlJdTZPqIUUaTYD4z/tvTOS1xRdUiaRjw7cCh2yMms1c5V//3J0xbO10kEC8xvA8nhJnQqsMh2P4h6QFzAZtXYKMehJXwQ5ap7W327EMnCdXw2N0pv9Lr5S9khN/9oTMy2tMIGtN+UZ684zTiAP+479xES6OvmVL04nGyCarIqMNu7oclR75Qv2U14CNRA3gIaMPv', + version: '0.3', + creationDate: 'Wed Jan 20 16:53:47 CET 2010', + updateDate: 'Wed Jan 20 16:53:47 CET 2010', + accessDate: 'Wed Jan 20 16:54:26 CET 2010' + }, + 'c0a8f723bf44e0aae1d69f6f85f8e1b747dfbe5ca0d78c5ebda16b32cf17e16d': { + header: '####', + data: 'ky36e85TGmGQ+O9FXAhHRXEz5eBQogwuyAEgjpsHaSUM22TowYEw/NkWMg4oT4M2DGIYoTyXatvea859F3kMWM5hUe16PaG9J8HzQcEnaTRmi5oe0cMJAlg6pl7ypLt9kUiqDoMIM4lM/eKO8E/bRZWnU1EsxjehYjQQUoeoSyyTAOhHlLfXS99TzCXFrJjO5rAgaJ7iAjNOcQ8Bm6ECau5ao9AVd5hqgMDEmLJhRwygcGHSTek3i3I4o0jIImcqpfNko/4SbEC4p7+V5Rggr1IG5DkeYfKuyqxgulJbtdkcWxAqPReKXUOkmSGlRTje8rjTTLx1Jv7QCc0hLDYc5pLd8j/G7mOwLG1nLTMeNekljKNCTLAhQ+ccDDq35Jv1cNhmA/icmRlMkztbsR7tzqFs+drQ', + version: '0.3', + previousVersion: '79047c5ca148b2915014c44d75874cfedf3caee20cd9f97a87ba2a291ccec741', + previousVersionKey: 'aLMGf0ucGPaKLVv+AunJaZWDg+gGncnBu2Bf7QseH3ma/jcMOZCNHNd44mNPKfZPyoXYZi6/ToxkJh6Nu8PmOL/SsHTlf8FBZxrNm1i7ZS2b3A==', + creationDate: 'Wed Jan 20 16:54:56 CET 2010', + updateDate: 'Wed Jan 20 16:54:56 CET 2010', + accessDate: 'Wed Jan 20 16:54:56 CET 2010' + } + } + } + } + }, +*/ + + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + /* joe/clipperz*/ + '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","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"17","6dadcd7ab23ece757d6990ce237bdebb68b2df0281c78cc1483d913318112162":"18"},"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","6e218e5d129105c20ac499307b260eb76bb2e753f6c319e17efdb848675c5fa2":"20","75f306bd520b483e86a1b436d94159020197df0155ab9058fb86586925223dc7":"21"},"data":"IQ7JDd3Yo3FJ+XLNiJRoIHxxFoR7yG6GBQUO+nDkTxEBQz9m7JAuHaP3S7Jz4NjZIzMKdw15CsV7bowAvZZ0ronJVhulfxFACG+IjseS9sWdX95nX3eWUywbC8JrNvX3ggo9xgDa38czKNb1bpgk29bJbnWmd0xEo/kSRPab2Ng9RYQqLmdhaAO13tgZOph8KkuuGS8Cdr4k0PyDpboaPlEMhdb0RXF4J0E1N2HRclOnuyd0D9NiHiTIM72Ne9SAsKtnNI0z1uZxxXyWMVT8JGJC8plm6F9DHas4KM5OaKfQ4zv5VqYwtqa2/msHs4sFE8Yqf2/qsDtk3e8RSzm368ee2RMQBimrd97AiOw7rc8G2hu84wBH8g59Dro9Ycm+S6uBjmR8LYlpdKJNDLchtBJmxbqKp14GhCfWLrrbzsxaIOVomzdmkq2tFE1nmU2aDQhHRh8c5PgrgTZ3VnDQUJ+JkLpzDhOmSw+Tmo7GcHkdYIhcjIW4pdvKf6hIl+V8Qj0lY01pV8CxnFXeqjBkk3IHIiNBTpNB5xwNUWDTX/aZLKngSkuxXaNKTpsXfS+gZPQmBOV9hgckkkUUY9Yhn1Md2kUyem/sCjWIz1IOBrE1ViXrmNNpKG0ryhgucdz7d2CQzHmmEdUEggx44SCr18MMByIkgidlN2eU28/lAZLQODB710rta65RWarXqhdWmbQ3/bWjmG79u3LP35vWicXw3lC6BRI2stJYyBG7pBW+m6wnbwWZv4XkQ6FiHIhBgb/nroiA7uNyhTTqsyDZa1w/nfftL4wive3jn3lL9Js724PR9tJ8aIDr/aHdULluAmzFGOXbiJKnwVnRexoq8wBEIHjaPAyuXpITpfbIW9wmxkrTIzPn79ptPV50DWmY5ulLjolTJPKveENk5kP25oX6SrcO6YlwrbBP2p1sYG5D1HzDIuBsb1UDV1eqSvsyrz8ENFogD5HCjkYYH65FYOeHzZtgod4EJz0kDZISuVYoU5dg0uY98LTvVR3DbD6gEdwnB62DNXNj2gzlbrALN867n70fYdaRcCItCq5gEH4Qq/eDsCn95IhUBIXZwnQJmEHN1ZpcuZmpwYpni0ZERzqeW8bPRabBRCdBtAhenlgi8gXhQzooIjPKCTepQ5lFzms/qt1G4I+szZ43B3tGgUDa+3HOD77mdGLETGMJ0Gh3MrD7lCNTcivwwytZX1B3JSjxxaN3Yjr73FjVUC1MO0kRETQgHLGomDD4wlSjqQ0VoMQ1OLb+5VNxxU2piPqz3GzYAPdOTHNYynDe9ec1sGTFRUdTNkUjhjPuHfC7eUiWadNm3IPWm3XY0Cyx/DvChiAhe3w60oRgxd2mJEH5wJSwr9J9hthLFTPydTu5TCW0oj0xXXDsns16DpI+eBMWdmqH0di+6jd67W6bpEtJw+4ntN/PmdWbSYKregQvgGbehZPxls2zX3kf7kdfnWBQ7qanq5+w7JmjVJuey6jc34X5E7v2WZJwn0l8VGGOjHmTkWUqzKPCi6OakxwRteqYhM9r7mbfq8oxsQTCNaPEE8B5pYsnWvJUQrNtXY/ERzpvvipTJlYTWGywVCha3ir4hh2jfuF6kkFYz/mjKA7lOR3jHFmdy1coCpNtb/YsMu6WaKLWA1Ifb1clsBYDL0pKqWOxvxZJmNamHMxdythwv/0FEavpEKTiuyp7OfmR85gjdl5+DOqV8kqvGRHy2j7ipurOxD6Qvc4DfCWZ2l0eDXSFvzA0opj/+bAIwx1QELSWjNkq3rxA2/8Lam9RUL3l9qk9MPc3DoWSsBZhx38NgHiy+f1zdwNdsq8QotkgO3ToclcPX/h3Rr54q9QAuLY9+KGbt7JxSU4tCvh5V83AQUtvAbHhANYVxjF968XUcxzprHR/49Vd2+OGGjIM3ttK9y2n9fmA/qDXL4UDM8W2VA2Xw8YnfsK4VuN8Yw0uRbriSI6sPk2bbVh6k+0imZEcB8L/7E0AVHC/iuknTTEpVM9x7xR+ykQveQxaMSt0HFI4bUqJAkYkpkfG2I1+LcVAj0sBiaXpL1H3Tvat+/WyLQn7yPTcfBm+JarrgsyKjTa/jKzIy5rz7a2P3VIXESE+gMoT3BBQ1+xFCjtwjChLBaFw+1iVVTSSVo6UyLq+3jgGsys8vriNq4eEpCHW6H37+DyxYZAVTfaiOOIU4YE6z5gcbXDKAxtgBSOf6wNc2yfzwSp9qeECpB/y3R8EO2CsGCJ0x8SawqD1dS3IFTmGdGv9DePCTkLUOoLullMYXxdIBY09QrhrzAjkgPy9IRZH614P61wcECrH5wxAGgVMwz2iApwkQ+BrBuOQVezbRGTciRSVZQtwvPM8vh1S/TlFsSjuNUR+AKFYXgpCuXnyOMDXswDErxLjZe/KFs3ttxZYy6lBwklxZ4t6x9WklDaRGW5uMmdP/+qxczbQ+7ilx1R5qcSSfGY8uaeTNEmnLCveD03QlGhigs4bs38saDjij20oIR3kK2YLFHwskthYsNX3CHy+KHaTysEW25g8v3glyOcZsSENb7pUGZl8B8gFychM7rNrIA=="},"preferences":{"data":"fwQt+Wxhev563xviKvItHr3k5MC7ciMmEayJZ7HfwTcWPqaF5Syf1czPlMQiDQzEgWWs4BmQqB0QCDDMi3VyGCrSzAtIMR4afVdRyQ=="},"oneTimePasswords":{"data":"8WhmNFYrgxqzrJwMx+goddfLb2wlXnREHH77BKpL8h4ZalAwNOAt0yoBMECtlnNcve8ufjGAXL80dgUgtqsTn8fpx7+WDL5fNynv5ve9mJq/qgqctQO+pvnLuvs4867NXYInHr84f+t8f0lyfYRQdpDJfem9ECrn5MrpQ1rvwB2PVKcU0f+VPGhu673QeDbqzF+95JfxF9Tnv1PAePL1EGahUYuxTED4y4fcVmsHKl9yZXcsuheM7ecik93cqOVSlnuN+s5c2KWqjgDdLzUjG2dDHcuY97v7JT7Pns4ad5C9i2dYLtNrSHG7QLw6RBS/EnBwGzK+sWFQFCU8u0qSeFb0eGRjvVb9SfIXSeTqAJK3JC+OLAVGiey34jFckykeQjy5nPjhSpqWWhZdpezvZHno3YCXSGkLqbazL6xtesNaZZAbHBKdrwIOuTdhMwArfX/na/gavciFM0zwGb13w6JX3Ar3iTqhnBR20zmv5vcZwIOjf36LSfSNnjT4sWE1Az+FQPmMPQi4ODHfLSJbwYQhwqM5Wq2yXHpKDf/e2RpBZ5JsUkDEyoGmglcLF+pXwk4Mn9LuNOztxXCRWaZ3M/5uVk4xXOqJax1IlnA4nlu+3N0orF5ipRwd7BfmQekiYyp69m9SJA=="},"version":"0.1"}', + statistics: 's6W+Nlk1/14i/BN4u7qN8oTc', + 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 07:46:44 PDT 2007', + updateDate: 'Wed Mar 14 07:46:44 PDT 2007', + accessDate: 'Fri Jan 08 12:38:42 PST 2010', + 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 07:46:44 PDT 2007', + updateDate: 'Wed Mar 14 07:46:44 PDT 2007', + accessDate: 'Fri Jan 08 12:38:42 PST 2010' + } + } + }, + '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 07:49:20 PDT 2008', + updateDate: 'Mon Oct 27 00:58:49 PDT 2008', + accessDate: 'Tue Jan 05 01:16:38 PST 2010', + 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 08:00:31 PDT 2008', + updateDate: 'Fri Oct 17 08:00:31 PDT 2008', + accessDate: 'Fri Oct 17 08:00:31 PDT 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 07:49:20 PDT 2008', + updateDate: 'Fri Oct 17 07:49:20 PDT 2008', + accessDate: 'Fri Oct 17 07:54:23 PDT 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 08:00:13 PDT 2008', + updateDate: 'Fri Oct 17 08:00:13 PDT 2008', + accessDate: 'Fri Oct 17 08:00:13 PDT 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 07:59:31 PDT 2008', + updateDate: 'Fri Oct 17 07:59:31 PDT 2008', + accessDate: 'Fri Oct 17 07:59:31 PDT 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 00:58:49 PDT 2008', + updateDate: 'Mon Oct 27 00:58:49 PDT 2008', + accessDate: 'Tue Jan 05 01:16:38 PST 2010' + }, + '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 07:57:17 PDT 2008', + updateDate: 'Fri Oct 17 07:57:17 PDT 2008', + accessDate: 'Fri Oct 17 07:57:17 PDT 2008' + }, + 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': { + header: '####', + data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38', + version: '0.3', + creationDate: 'Fri Oct 17 07:58:00 PDT 2008', + updateDate: 'Fri Oct 17 07:58:00 PDT 2008', + accessDate: 'Fri Oct 17 07:58:00 PDT 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 08:01:59 PDT 2008', + updateDate: 'Fri Oct 17 08:01:59 PDT 2008', + accessDate: 'Mon Oct 27 00:57:58 PDT 2008' + } + } + }, + '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { + data: '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', + version: '0.3', + creationDate: 'Wed Mar 14 06:53:11 PDT 2007', + updateDate: 'Fri Oct 30 10:52:54 PDT 2009', + accessDate: 'Sat Jan 23 02:24:21 PST 2010', + currentVersion: '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5', + versions: { + '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': { + header: '####', + data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ', + version: '0.2', + creationDate: 'Tue Apr 17 10:13:41 PDT 2007', + updateDate: 'Tue Apr 17 10:13:41 PDT 2007', + accessDate: 'Tue Apr 17 10:13:41 PDT 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 06:53:11 PDT 2007', + updateDate: 'Wed Mar 14 06:53:11 PDT 2007', + accessDate: 'Wed Mar 14 07:24:35 PDT 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 07:33:00 PDT 2007', + updateDate: 'Wed Mar 14 07:33:00 PDT 2007', + accessDate: 'Tue Apr 17 10:12:56 PDT 2007' + }, + '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda': { + header: '####', + data: '9rcbGeLFjW1cwULSScOa5zfb9BZqoSi8IvarxwjLVz+4VqApsBZnwJsxJHq/L9zV3SRYlAQRRLNy3lhpO/fJAOg4RNp68KdtA+IZfCsn1MzwfOoBrnTTELPKxDim4US9xQNdJp5ffWoLB8demEL2YkSNTrPVr5crvVPyepuRCzdqUoe6Dba05tR6Ju7/+d9K/cfJg+KI/ziSUSVlOTsIahGkipvMwYzhCOqjljJvdeF6XLLCh7F70lFvpW5vtv5jNmpkgvAhfxgovIZ3tav0WDc+DEdFNHNsCtFhwRYsb1dH5Ry01M8g4vS7PDkuCNYOvjL9bS2Wmy/lVulM9dYdB/d/gKWTjbqgre/IR1TPPdtfiVBo2J9PUvM8P/c2LmQrf63OwjWT74N0D7q/NuVn1KXzREQiyMi6ezzujzJolpNVUNkJFlnSHl+EqnfFiiR5ALZ7Nts4uWLe4Vpn0XmyvHoAVDBK3fw7e3n0tIG4x6k95guIWRKdDpYLOTHOe9jKJbc6KxdGmt21/5pX4KdeWavwirKRcXW6ReJIOVF+KREEZZOGWu7UKWgqgdaMuvxO472zzXzxTBvnpOmnxl/oIkhs23OPxHEwHXX8gXnyA60hd2tthCfmzfI48wWkO40cUTFnqO8htWRXwbUa9gYTjYWDTmoIyK9AgO+PfBLNqx3JzJYAymDcw39ItO2lIcEBkZ4=', + version: '0.3', + previousVersion: '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544', + previousVersionKey: 'RDzOj7LWZcdVg5KmmIT5VXM0cUFeC9tC3n0IXDfNpj12cq0w3k1rpBYbt4eSEkOcdM7Va07FPNdZY4Pd65xBo2MGc56Ka1pX3wW4jTxz350qtw==', + creationDate: 'Fri Sep 11 05:54:50 PDT 2009', + updateDate: 'Fri Sep 11 05:54:50 PDT 2009', + accessDate: 'Fri Sep 11 05:54:50 PDT 2009' + }, + '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549': { + header: '####', + data: '0ck0NbHAOYieUs5c1U6xSMf3pj743aIv1nnBnB7f4vsvKpMiYleQwr4SwY1W6vhg+3sLnO9C0CCD8Brt4V1wScz/STp4oB3hoy31W4dsAFsUyAWFJ8MrYDsZW3jotIPVbMKxu+4Yp051iDPcFKimDhfAu1zVyiVE9llNj3tP6d9gukUNfGZ5CvFmEXcheHB8t81Z2tgeO70EELFUn7uqKJwh5xCqTeogPtsifmCjgx8Yo6hi19vl2TDAaX0HquFO3WcIAL185tzYZ5rU23BYwxD7hVfan7lngSVq614MsEB3EX9WiHRoissSSajNkKTlTW8zsNj3VlUXKMQiJ2aA9Pi+/Yt9sNAbmyTl6T5TNN4QSquLPLyxO4p+OIjra1WPdmVsCti7fOyGirogfJF0XhZg4imvGXK0c6lPZIlg/OEnoDSTiHXlOYpSgaEw1Js5HZ+390XY0KYPtpsZlY+oeVS4p29HN7x3CEairuIldEsZrk4whiVcwzlnmw3n8wiewumus4eRh9w0CIwJELKeMiz5cX4bX8+AKS+u8O1W0GwKlEGTj/joA/M=', + version: '0.3', + previousVersion: 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd', + previousVersionKey: 'moIwxP20kmN6f/+pgb8pJNqsLUz8Qo2BvcAFnXBmiX2E4oL1pakM9iq0e3IAiNLApmID2TwyAxhsmKj422R9uWXsUFd84LRRt6lMKa3/u1dC1w==', + creationDate: 'Sun Oct 04 14:05:10 PDT 2009', + updateDate: 'Sun Oct 04 14:05:10 PDT 2009', + accessDate: 'Fri Oct 30 10:52:36 PDT 2009' + }, + '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': { + header: '####', + data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==', + version: '0.2', + creationDate: 'Wed Mar 14 07:26:35 PDT 2007', + updateDate: 'Wed Mar 14 07:26:35 PDT 2007', + accessDate: 'Wed Mar 14 07:26:35 PDT 2007' + }, + '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043': { + header: '####', + data: 'jt/CbXS+TEjH/jPrstH7cQZGK3yse470grrhdAOdWoGVtFMmL7fMJZQOKm5IQSrMHFEsH3PoSs99Rr4ui/u71vUb6s/TIsjyv7yihnCYVsOEJOPcnL2wynciILV8p48Lky1wGztW+oSynYOG0CGYDofFhF/MNCBsG1EcTqW7Cf+8rUiS4nA4ZRZVv3HsZp6rCabJsAoK1pmf5tXGJHPjS6xdy1A9ea4bV5Gad0pu8IXvjbZTrDymHem0t8C+oZ7uJ/mG9cFVcNykXoO/TDP0goD6KvTqtdY3VWNNTAERycAW6jFtdMv2W/AFNmnYatZ+EbSbj6/RyGaNnRv/ceBitMh73HRr1EVtZw0wPthMBXwnlPbpkfUwWPBHYpwImligm62/6YBhxDgnMZta7TSi8apT', + version: '0.3', + previousVersion: 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521', + previousVersionKey: '8BbhE8C41VX8B8m3TbfLz4bgSfE01IAUl8Zlu2YFdEhpw1erqInN1eRE6WLyBB5MxckmJpbn6VSizqbFbi/3Id5p/fibHKmbmNp6xu7iIo5zzA==', + creationDate: 'Fri May 22 03:30:43 PDT 2009', + updateDate: 'Fri May 22 03:30:43 PDT 2009', + accessDate: 'Fri May 22 03:31:39 PDT 2009' + }, + '6ca08e08104f73943447eba327c8d0bdab3ab9a01fabec1bd4734b52034a9544': { + header: '####', + data: 'XKsPGp4MeuvDrgikcjbMnmw/Gz74sTfyP3lLylbrtEZJ3aGSjRvE7s9o3Ya9GKRhYxNQ0dXT0vM6xIE6r/dMt8PwU+/5dNtRhCGPAHvKmEEGb6EBwR7gUDxQLyFTAYX8ut+CpyNJLQa2pHoEl5aNUTjk6blYrKp0GHKt2Q3PZrjIn78rcOLcKY5bx4OK0h9rN0G8mOFQ0g29knKyaykv8dja/Uy5XBeshKnVT7YRHk1nRuwz69ZcX+1Z2qzfw5sxJx+fDK+otWVpjzDP02qqn7ju/r3GgSnW8p/ghBeurUCLdQiS+fFAevhOwCkZGjPMntG3Q4qVt42VxIiiuvfShdaSsNMOW9Uziew3XwOYL9mNIOSdPSjtry4sKrAh3XNmfuJjWTy+69Iyi85CtQ6xMFilANgSBfTqThUePCrEkv9ZBbvpRovuuljlxqZ3gUmtvwy9a3ACAr8SMGWX0ydQjKyvZhoGRCBM+ZC7zCe/JmIpdklvNd/+HqUgS2iAnf3CeH4gUPQVizFR04Ysgj00xO6v4bdY2bYVKIxunygBGNzySi8DeSREu/rUKWgx0KY7S+Gg/jqFMYpE9oy8CxUCmSLeNrnxUgprPqKrr72yue0kBGVoYyJwhXo4MG+LPV0rtVp8b2GeHE9fYmyEZO2Ke93SrHjezS6CnWQsvjYsFYCLdLtEGwo3mpS46DF69LlO53k=', + version: '0.3', + previousVersion: '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447', + previousVersionKey: 'eEvij0YZ1r+5cNNpleVHE+kjCZlSggZuE+3Kum9b/11JGHTgQ3bY/o5amM+4+FPaiCU0Zd6MWFAI4dPscyvAS9in6WdTOm7z3fQ3uqYAtHghPw==', + creationDate: 'Fri Sep 11 05:54:01 PDT 2009', + updateDate: 'Fri Sep 11 05:54:01 PDT 2009', + accessDate: 'Fri Sep 11 05:54:01 PDT 2009' + }, + '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { + header: '####', + data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', + version: '0.2', + creationDate: 'Wed Mar 14 07:30:09 PDT 2007', + updateDate: 'Wed Mar 14 07:30:09 PDT 2007', + accessDate: 'Wed Mar 14 07:30:09 PDT 2007' + }, + '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7': { + header: '####', + data: 't4ohy1/z6oUzyQLtqQoumRzcLCnaYjL/+WQGwE6yIXaGEhCWywe0aIVusPKLcsfYTCXVU1/dXtuucaZoMw7PMSOUx9awTp14NmShaT/9VKChZf1TLi0CO2jOUGsvO4DHlNAQhJhas431l83F+h5+hrkqX8j5kIhzpwlroGEjkml0fswmmwDyHbSTgVEyErZc+b3V+9oUCwzYvd9ITHh8uWLa6j+GuwZTZAk2FY7Vzoh9K46WO3/qCz1pJ8JVkcffun9alK8qzK0Wp05mMLIrt+WHFFTKrG9zpBkcswkbwhJ5ZnakfYLJ8GPH7fKnAid1FGW0Owms058smDBmFO20HyH+ho7SL80Q689W+Jx0+nkUKvxWtq9BWLW6Z3ClDZOVITeg35gQVr6aRzZ+VZwbAy++', + version: '0.3', + previousVersion: '30cd48ae2101c0005fdbb57917031ef36c2e5681890f212a95a2863463369043', + previousVersionKey: 'i4e0h4QhuN0B39drNLsOWruy+R64siKHWxc9YXgpoCPitWL/ika1MVCRX7CJC7lH5WD9yzx6l9isAy/Hb3nUIEp97VcFKG4S0gOaZkdWNZ/U5Q==', + creationDate: 'Fri May 22 03:31:46 PDT 2009', + updateDate: 'Fri May 22 03:31:46 PDT 2009', + accessDate: 'Mon Jun 15 15:20:17 PDT 2009' + }, + '7c80cac9c8b9b5f0f533dd3852d89d6be07963eebfbd2081f2ad6d2f2a06b447': { + header: '####', + data: 'LDAixBQ/CEqQX35jio3aAXG+Py4wNylXI1mQJ5IDxnpqmkFZfOXCaScpwIkQwQzEOjh9p3cOShzrBm6r234HKxgg0ufFnkTWbQSjCgekfVEqiBFi2rWSj5v6a5LMANLwtCz0b2IPr6Z8LSPddgao7P0nwBdCiKJAnY/uGdvSn67WSFhAUGAIs5ZKIZQf8Zi+cA3hd+Xlv1W/2+OXLaIPTkD1bCuQo5qEiAoOl5mXngWOmQ2kTGpC7Hfkknm/uzDeiZTe8VpGjqKTwB/tl64LU5OD26DMpihnVeQNqMpYndEJO7Yu9Zodv8WMyYmVlrw1UzTB4BLTL337vVm5uBiUjAfJIwJx3b3fXxdEiWFuK8uwOXAO2X9OOKfLPuowOj21B/+zRLum3Dti23IfHab5KwSq72sB/vjpl/KVbcGsWZET4VTCZvO04T6Emjb2UBLFLIgInZ9tqN4RXSKz0Uj4n+pitmFSDleuPtL8EzEESX6FtmT/IVdr5AGNjv93wIk5CgeoK2YiNlpTb+CHbcA5HPn+TH9T4999mWrJh5hxZ1vGYxlAd1AveMCgA3y/Wl+kZKMnUatXPM0deUS1GnzpoRXtI0dUi6J5sOHxeahZL0TQbCbHcKkoaSJklMl5YEVaLXyakO4ATKyNcsPfDQrPvWfra1I59RI3seStv2Q0bs14Zco+0opvKN71R/HxjF/etUU=', + version: '0.3', + previousVersion: 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b', + previousVersionKey: '3JAEXzigeX/PwpA42+K/CPSpP40EO/j++M6pB0NF71EfKCApWSWy89flo0KbrckF+mUAjyY2hLYBc/F+Q2vgGNhAZqq0vo3wcUpFjFktqgRZ4A==', + creationDate: 'Mon Jun 15 15:21:15 PDT 2009', + updateDate: 'Mon Jun 15 15:21:15 PDT 2009', + accessDate: 'Fri Sep 11 05:53:23 PDT 2009' + }, + '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': { + header: '####', + data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik', + version: '0.2', + creationDate: 'Tue Apr 17 10:17:52 PDT 2007', + updateDate: 'Tue Apr 17 10:17:52 PDT 2007', + accessDate: 'Fri May 22 03:27:59 PDT 2009' + }, + '933abcdd036332b566a70beba4ae486123475dad2903b00a939c067c34a074f5': { + header: '####', + data: '8mmpKGrkSqiLyreEtGdKN9EXeb47uEN+XkSXEhdIxkMkmvR0A/AGtKjG1o6bbSXfPzAtfrMfJJxwyhWcRVqcikzc0KwINua4X+1Grf7QG2IOYYFqujmLyCwClGSRaannCAbio7+YI2PlDrlMrwB38RvMde6zrMfZzl2O75nkVX3DH+5IHJpwwYeukTSAu5EQR17oed+xoSHkKCQG3ToTsbnGPwZSGM0D+aiTXVW+PJD8D8LvDEU8i3EHQ9E02+d3dKPV/3FGRDgvwLIIjHU0qX5khYJ9PjqSgAxOhRKFwnG1kJn6NG1rvsXYgefJORElib/xijoCM9EJkUZ9e340WwhfZa1GbV7gLEbVn2aeaLcaTjhtPz9pL9WQOklChvdi/0XaHRrgflHogqC0qUQ63lA2CFOXwR9EXspZIi+zLzgAaEMGN0NlnbGHjAiVz6SVU/RUkh3DkKmMuGNS1n93spVbMMLZgcT5zxBFzT6jARvC8qKaxe9UlbMIH8ZCXMrq26V/sEZrxmPT3FZB+dmmqA9lLEBFEcw927uu1U3kZwXhQArQCN3MbEQ=', + version: '0.3', + previousVersion: '1ae171ac58981896484c222ab42373b0b6bc3d054dd56faebdc9018f3abbf549', + previousVersionKey: 'gxQ13UMdZF0F7chGySUkuhxxSJ7CU2wubdG0tijs2G9uxYEY6ADjVX6zi3nrft7ggnLM8LyuFtZqj1wMX3pMUsbxZq0v2vfpVaYZ9cN1pahwMQ==', + creationDate: 'Fri Oct 30 10:52:54 PDT 2009', + updateDate: 'Fri Oct 30 10:52:54 PDT 2009', + accessDate: 'Sat Jan 23 02:24:21 PST 2010' + }, + '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 07:27:35 PDT 2007', + updateDate: 'Wed Mar 14 07:27:35 PDT 2007', + accessDate: 'Wed Mar 14 07:27:35 PDT 2007' + }, + 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888': { + header: '####', + data: 'ZRJXJ72ZBH01gAML0R7n42fI0WjdbVXzyZH7H5MP2RgtGuVvfdadVK9+U8mzdf1Et9DoKrHhZUp9baeREPO/Fk0r2IO8NmKv/8+rMkK6x4qeWnI8ZAJfQemGtqke/VcTn4KGAyTeV8arzXn/whsLpp/xN087NdDw9dP8PLb43Yk8TNC1m2d85FUagSh4NOI3rmcbHAiCOQpqHBPBoJY1Vf4Pxu949TEUm6kT6Rl0n/sb3PSLu4LSa6+WiGZJ4mgE+3XZyfozrJsvGoTYSkim3MTwhrCLEVaDMTq4Ei6FyG+TeV95Q9Ei8HHwBqdp0fxUxavNe67Oo4m+ECiRvZ24b5+Nz6POBjXfn+61yCyIhz3SV3IaYIF3rgXRZA1q2sax8kRGtoG7ONxczUqGyQ5S6Lht', + version: '0.3', + previousVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854', + previousVersionKey: 'ZbGA3id5JTGeRjVUR/LkntSGjPDEbZbNrQxc4SiQDdlDO3dJNVpfRp69PSk6vqEiZ4r/6OKvE+fl2TtPadJQ82fP7WsULtrSkYryQL+CQvz0VA==', + creationDate: 'Fri May 22 03:28:11 PDT 2009', + updateDate: 'Fri May 22 03:28:11 PDT 2009', + accessDate: 'Fri May 22 03:29:03 PDT 2009' + }, + 'cd3479e91eedabe34a1b76f0f26c69d7612672281bcf5d682a787a48caa66521': { + header: '####', + data: '6TAJAQ4qE5l2SybVzeEqQxYZgVow0MKzl8xwfoE0HeuSr8uJlszGas5NaJL1SFI5sDDwIJzbtIBE/yjaNwWw18+JzswIWmkLW+kTIAtJKjNtWnaGlDJMTA4OIo5gj2Vqq4o1VngzMTk/DV6f5ob3/HxN+YpE4r1u2SUVeADbjcyjRmYE9ygvuvQ5AuU3u2hzmstI582kBlksLPGhX6nJfAPCrSkdphNj28T393p5w82/FFCFNHKjgKN/xI3Rotq7rObFaNid1tmHvozKLYeLQQfjglJ2rRDQDTOJONRVJEObDFV5bmaY4z3XljO2nbQ4iMK5CrTFAYTYNph3/WOQWjZHWmAXaHMYvBSlICvF99C530sOGQYIaBWKFuOv/pNuCZh/tBNVcI4pU1dz438/7LQf', + version: '0.3', + previousVersion: 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127', + previousVersionKey: 'U2Z+xaFl6o4XH/8DktJimjP3+1PaYRf1mZPW0sulAOykDH0LY2U+kbBj+mfNV8rVAJlA7O8LYl8AlUNZUTS+036MiIinpD0Tmhkc91rFkMYgbw==', + creationDate: 'Fri May 22 03:30:03 PDT 2009', + updateDate: 'Fri May 22 03:30:03 PDT 2009', + accessDate: 'Fri May 22 03:30:36 PDT 2009' + }, + 'dac2ca240227fdf7a08fedbc998c49ee7b6fd622bb8404e804c5dc7f439bf8fd': { + header: '####', + data: 'zqOJI8Qken5hwXQ4MFRzfnB5tnROjMhg9mw+aYwwvI8VV8aADoyPuaRi6bdxy4LP45PqVR9G2iXFT+h/WaBql+rz1AA5AVz54cpd2gdDh8Eec/PJXyL3SfXW1PQoO3bwhW6rkR5cNQf8xKxlmGWLvE88AXT65tV/RdYJE574aVEZexzo/40X60weCl1ZITl8IH97eug5URe1lSBFsy5sjo+SE09FqtnmnGy4O2LL+0XSR7xJqiJihv80msEgk3lTbwUEiGWm3OiDnvLk0GjaMy3+EGV2/rHZuICMJkD4ge6cIBc/h00ZCFnXN4bX+OC/KpEFgtnPgQ+duVpsVNdYmNwxSavyFs/UnFFDTDIPZxEKhRHFTW9zaqu2jVTZd4+/ro6TSYSlEN6F/jtiL06nM/F14Bp/dYuqBZfc+N3vx+72jj6IOKTHtqvlj6jdSZseN8olODT2IGI/fsjR79biVCIOODAaF6DCd32ClvoenCVPTIhMc2AfuKTbleiquk95nN4lgpZbMzrrvWHPJD0oKXHo8X1GJd19QCj+IhzCTx1Ap1JPOTMIG+reaxxwicGjH5Iios5DmA4gjsRWj9BVr+QmMJmY4KTpyRG1lVYovm78VWf0nzyGLNx5sgWrRyYLOI75m0zUdNGDUpKGSyqrIuEwOrI36uRr71MvJ0ui1HXBkDbPIvrQ01UyocO1paeHyTk=', + version: '0.3', + previousVersion: '191d456526b14fc5b4ff11b3f856c9568562bbc68435700a2fef0d176482edda', + previousVersionKey: 'zOAbF4q8A+LjWfMMXHRHH2DmzdToA6a2U12y0G6cyAm5tvz1BrrAcgk/5dx0yvFF+ZSxuOOfnvCPVBN2kT75otq44tVEg+FSJ4khcC6HThCluA==', + creationDate: 'Fri Sep 11 05:56:02 PDT 2009', + updateDate: 'Fri Sep 11 05:56:02 PDT 2009', + accessDate: 'Sun Oct 04 14:04:58 PDT 2009' + }, + '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 10:15:09 PDT 2007', + updateDate: 'Tue Apr 17 10:15:09 PDT 2007', + accessDate: 'Tue Apr 17 10:17:01 PDT 2007' + }, + 'f8ffcda2eddd2f6d19c4be17f6f509f1f66fc5d4bff362f402c6addaeb9cf32b': { + header: '####', + data: 'Al9KSfdnvVJW+GPqYbIGXNDb4KefUjtkNTJbk0zlBsyeZc+eoDDLJKy3ukugFfDFDmX+g0U3lp1UIsRQB7JHEZ+NWKPJu/hyvbTmwuVFZUnGEZMhMOIqc6nECN+VFCllxV7QBKpdcRJ3E3fiYP4fV0v8wquOD1dfsMs26f3y2fOQLNS0+UpDe0GoRw2R3+lbot3qlftdO6vb5+LYjZEjdSI/G2fPQ3VsS8N0KLLNVHQxix4xn4Qn78i/ImlxbtyoKNLP4ZIaXZ9ELuGvV+yKaQVOVTwxpJOWKMu1Do55cMwdFjxU7Gid03xEYEaZpClcsrbwdGgkJo2+WnpC/L9G4I9X5L+sVISbO49PaZ9DMdQJAlY5QCIjokPchYUp9Vr9u4KcgbAw9FrLQAMSRLnWhf0bLr0mv2ioTOlQKPFBkTIuMnsyglD856ZYQOIHl48+K5HvUZYZqI5UJjPXdrmzycD/Yxt878pSnkkfeyX0Cr/7Rwfq/zOPN5XJcwsO6j9ubuXjnIos0E/SG1BOKrLY+sE7SXzWOqhpzkApb6ILaGhtHNOHmYAckpPAqCe85g/XPZsmWjsABB64Gwg9oviC2ew/IDXigNXGtY8tbQmAny58QPfRihT5HxCRMFP2pA1Xh2WU1vEXtP8=', + version: '0.3', + previousVersion: '739b67f6c1d52093f5c2153b406df90cd8ebf303ddd0d13d825fc946306114d7', + previousVersionKey: 'B0wCj/b+UZP07a7VlnKVl/wtiaFzCmPux+T4tBFQati+nSNQCHUQM2XAQ3n1VWeewIyLjKlVI6W7SXRZnCxlcOdqBLDymDkhKfL0FIvmHNKmig==', + creationDate: 'Mon Jun 15 15:20:54 PDT 2009', + updateDate: 'Mon Jun 15 15:20:54 PDT 2009', + accessDate: 'Mon Jun 15 15:20:54 PDT 2009' + }, + 'ffb687c41ee598b30cf28525024fc18ba96b3d7998fbb298d702311f76ca2127': { + header: '####', + data: 'mZNwCsPrEohGEYglwUcTQNPDGJWoQRcRDIoWJ482qFJu617UU3Y0hML3CZ+ALtITVpnZl6mGZ3nHCpigt5naJmvwjyV9O7SVkGjc7mrzvjQSP2jrlXGXVIPqjsywDgG74bmaOPLEstQ9Sb2UPGIdinYdDglvQsIaFHQaWHO9bSYLjitfuS+qH2erK/QhqJQ56LxSpcnF5pevfuKZVAkrfhYAhIxqSQ15lZ3QSHxJfT8pQntR8QWL65RetkX/c9eydWyPqVFKqCTghU18p2Omz74UEakBBh3o6DxeTw90UY4YM1tRmsalS3oYG00BFDfDD3mEVZNSrqsxdCikqUSEGvq82whYxsFTj/5fHVLoJybYg5MfpLR+iW8O94g9p2d3jx2mTeNNjOZp+Q5/Wc4rKS7r', + version: '0.3', + previousVersion: 'c7add675f676c4615a2849d5017ac8db9066265253ffe7e03b34ab8260b10888', + previousVersionKey: 'RFTIyzDM9GP+QklGI/YfTgxB64iqyF7+c7bZntSZlFFDkiVN7pJbToZjl47c272J4dPXFxkORR2o+pIyYDdRvKQZQ/oHXp9aZi5BDKGwHYkl8w==', + creationDate: 'Fri May 22 03:29:12 PDT 2009', + updateDate: 'Fri May 22 03:29:12 PDT 2009', + accessDate: 'Fri May 22 03:29:51 PDT 2009' + } + } + }, + '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 10:39:35 PDT 2007', + updateDate: 'Mon Oct 27 01:16:14 PDT 2008', + accessDate: 'Tue Jan 05 01:38:41 PST 2010', + currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463', + versions: { + '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': { + header: '####', + data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=', + version: '0.2', + creationDate: 'Wed Mar 14 10:39:55 PDT 2007', + updateDate: 'Wed Mar 14 10:39:55 PDT 2007', + accessDate: 'Mon Oct 27 01:07:56 PDT 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 01:09:11 PDT 2008', + updateDate: 'Mon Oct 27 01:09:11 PDT 2008', + accessDate: 'Mon Oct 27 01:15:58 PDT 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 10:39:35 PDT 2007', + updateDate: 'Wed Mar 14 10:39:35 PDT 2007', + accessDate: 'Wed Mar 14 10:39:35 PDT 2007' + }, + 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': { + header: '####', + data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=', + version: '0.3', + creationDate: 'Mon Oct 27 01:16:14 PDT 2008', + updateDate: 'Mon Oct 27 01:16:14 PDT 2008', + accessDate: 'Tue Jan 05 01:38:41 PST 2010' + } + } + }, + '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 08:01:24 PDT 2007', + updateDate: 'Wed Mar 14 08:01:24 PDT 2007', + accessDate: 'Tue Jan 05 01:38:39 PST 2010', + 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 08:01:24 PDT 2007', + updateDate: 'Wed Mar 14 08:01:24 PDT 2007', + accessDate: 'Tue Jan 05 01:38:39 PST 2010' + } + } + }, + '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { + data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', + version: '0.2', + creationDate: 'Tue Apr 17 07:36:08 PDT 2007', + updateDate: 'Tue Apr 17 07:36:08 PDT 2007', + accessDate: 'Wed Feb 03 06:28:13 PST 2010', + 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 07:36:08 PDT 2007', + updateDate: 'Tue Apr 17 07:36:08 PDT 2007', + accessDate: 'Wed Feb 03 06:28:13 PST 2010' + } + } + }, + '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { + data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', + version: '0.2', + creationDate: 'Mon Apr 02 10:12:44 PDT 2007', + updateDate: 'Mon Apr 02 10:12:44 PDT 2007', + accessDate: 'Tue Jan 05 01:38:40 PST 2010', + 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 10:12:44 PDT 2007', + updateDate: 'Mon Apr 02 10:12:44 PDT 2007', + accessDate: 'Tue Jan 05 01:38:40 PST 2010' + } + } + }, + '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 11:09:05 PDT 2007', + updateDate: 'Wed Mar 14 11:09:05 PDT 2007', + accessDate: 'Tue Jan 05 01:38:42 PST 2010', + currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5', + versions: { + 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': { + header: '####', + data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=', + version: '0.2', + creationDate: 'Wed Mar 14 11:09:05 PDT 2007', + updateDate: 'Wed Mar 14 11:09:05 PDT 2007', + accessDate: 'Tue Jan 05 01:38:42 PST 2010' + } + } + }, + '6dadcd7ab23ece757d6990ce237bdebb68b2df0281c78cc1483d913318112162': { + data: 'u9H4/IGgoAZuCAc7IsjHXbWl9RlIcyWJQuF+upwUgeQ1asbr4SX0WtB5KIfcS91N2nCaNHbHJfr+fVAjZeo0rRd+6PGkmnMLwcluvanKN+5VnfG69Xp6Drs61xq7yxl+SD5AUiU77OcE7be2dRJC449CPA==', + version: '0.3', + creationDate: 'Mon Dec 14 02:33:48 PST 2009', + updateDate: 'Mon Dec 14 02:33:48 PST 2009', + accessDate: 'Tue Jan 05 01:38:43 PST 2010', + currentVersion: 'b5d9271386eb38764c1d80c2792eb985d47909f2e0dddd16047f1a6415b70508', + versions: { + 'b5d9271386eb38764c1d80c2792eb985d47909f2e0dddd16047f1a6415b70508': { + header: '####', + data: 'g84GdVAIChqt5x2dNYsVR52cAtNqtO9NBRf3ljXQymtSLYEKgIep0jkzRTlni9fj2Np/MJ1qQg0uGn3qyjukHC8t7n1L52q5OxkrF6ffuYAlP/E8+NQo4Bm3UxmGEsmD8mbH3kVCi8LOJx0ZGaE5SqwafO4GWz5j8YX+dOfuhz2pKdpU6NaSrkCb21RJN+vOmAs5LQ8TfCLc1hd9FPxU6w3H9ys+Y5D6K3XP1cP1PU5N3vTFeq+Yl7n15xOPTsO3e88vPFtINpVjrv8h+VRy1U63MOWXkrHWwdUPKIBWx3nqg+H3dDH+lONWvrfriIMJKlQGF6jzfJFBV6yMArbi6lBlgPMOFIo5Pt4DYkHQvon7JlSC3JbHCIA=', + version: '0.3', + creationDate: 'Mon Dec 14 02:33:48 PST 2009', + updateDate: 'Mon Dec 14 02:33:48 PST 2009', + accessDate: 'Tue Jan 05 01:38:43 PST 2010' + } + } + }, + '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: 'Mon Apr 30 16:10:17 PDT 2007', + updateDate: 'Mon Apr 30 16:13:27 PDT 2007', + accessDate: 'Tue Jan 05 01:38:42 PST 2010', + currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8', + versions: { + '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': { + header: '####', + data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8', + version: '0.2', + creationDate: 'Mon Apr 30 16:10:17 PDT 2007', + updateDate: 'Mon Apr 30 16:10:17 PDT 2007', + accessDate: 'Mon Apr 30 16:10:17 PDT 2007' + }, + 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': { + header: '####', + data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=', + version: '0.2', + creationDate: 'Mon Apr 30 16:13:27 PDT 2007', + updateDate: 'Mon Apr 30 16:13:27 PDT 2007', + accessDate: 'Tue Jan 05 01:38:42 PST 2010' + } + } + }, + '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { + data: 'xSjnJLMCEBBiOM2RxFm2EUCxMy9a2eexGsBj851cR/PsJlfG1lCh8HwD1i7HEWVFB2GBK9Pf+U7TpNSYsq9VY+AzBNz4p1aSg3Hswoou4OpCCgnBpeNLkr0q7KBmSVmSH+omECgWzbqux3LiqT7yEWxemVRA4ah4a09DvhB9bpVJiteBGg==', + version: '0.3', + creationDate: 'Wed Mar 21 08:29:06 PDT 2007', + updateDate: 'Sun Oct 04 14:06:08 PDT 2009', + accessDate: 'Tue Jan 05 01:38:39 PST 2010', + currentVersion: 'a999c255e435e85633f136d0464f29e6d41f87f46e6fb50ca63adeede9a6650a', + 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 08:29:06 PDT 2007', + updateDate: 'Wed Mar 21 08:29:06 PDT 2007', + accessDate: 'Sun Oct 04 14:05:49 PDT 2009' + }, + 'a999c255e435e85633f136d0464f29e6d41f87f46e6fb50ca63adeede9a6650a': { + header: '####', + data: 'xw9i2USOB2xkgG3MBp1+qq9e2nwapnEt0usRAVmUWXcGGLbXJi+ImdrFNGPg3TSZrTIXMdEbLmjxAcxpTWlBfd5NhBVDzY2q/stiNaUWfI8JAHdl7E2CQRHa9quVnxPzYytVbUP01xoUokBWKQnqHZduADt7OKcgLy5iheR0ECoFXT6lKcJtD8mV5TZqKlYHkhNR8FehkNrhX2BWfxDHtlxZQNOK6xBCHF9YQGk3PQqmeIAbvxMiN2sGCdH4pXAURHIcF4uayV96bmCa42r+i4h2p46BcNghSR84ipC6Fyh1y+oGyZ5GqaolmVQcZQ5UbCba57+r5OOSWqmpmbhyoZ8rPOa/ZYFiZDj9UqNl7Ny6fB7PqWjVs9oSLb3oLe3oqfrONvJ/WmttA5J/jztDYYN0peN4AAEiNQLnFZuoHp4S+Wxuf0c+99N+I0egIIgIw88+ssowwMY6Xrf6sxEmA7B6hXB5V7TO3J1DGkVr4Kw6NgxMrFVw1AlqNpBrxKdREYaGRmLwB8/jOC9tr2RzP6SPylXzeOk9/v3XikG0CZckPATqLG2otmZ0pVpJc5XwyKKhDAZWYEzPKXXZoLfdNoa4SAiGF7/otBtH8k1D8d2rDMlhigIjtYR8WvBxCdfvnFeD8w0zewymA1Fbj72Dv8eHtnnNYYsJiHldQimSgcaGkmyFr0oVPo/skLjRjBsQVbiE066eTAjqrcAfKK7pg295Mhgo1aU9cyFPfOha1yiM6BKulihLTMbCr2+KTdMGagVnBxKFmfWJBNbl1J/b5ztazo3A4rIOddUPmGj0uQpaOVLDaFIVvs+3d13JB3iyYOz1nAYlOptS0yzNEMlJMDX4F5gkABGFazoPPQ7PgQ5JUmRrO4BBnp4HvJHNY0Ix9LOUfaLcp/533C43fHTcofB0AVqpdnU2R4lPl9FkUsyeQ1vmY3Z7tE0ZNbM3rE1P26LlEfXg9xbSBzRwS5EOxZF2ZJv9h9a8VPPbMnEUt0dZrXhyUycHF4SfnKLmepZkHTnco64kY9Mc0vJzy5gPCF7z6SDzeA35SX2T25Rl6M+xKSeU1vCv5kPWDpacFhXX/aVJnSlgjYKEWzV4jTGdlg2RA+034JpbsJgDTIqdLYdC44EyZwocR7MObXf0OTprugDIM9AGHFlxPda+TO6Cg0mI7UMYEP/D7AU=', + version: '0.3', + previousVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7', + previousVersionKey: 'tVHT9HgAaAzSOMZrMyvyTvuJW6P6cSGU0lUWky8NCtKipfN1BPGcX3sVgEf/PTXwKlNxTgpogRDGhDMIl01RHPaqAIXY+W4x/u3bdH/c2NTlJg==', + creationDate: 'Sun Oct 04 14:06:08 PDT 2009', + updateDate: 'Sun Oct 04 14:06:08 PDT 2009', + accessDate: 'Tue Jan 05 01:38:39 PST 2010' + } + } + }, + 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': { + data: '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', + version: '0.3', + creationDate: 'Thu Feb 12 03:45:43 PST 2009', + updateDate: 'Thu Feb 12 03:54:37 PST 2009', + accessDate: 'Tue Jan 05 01:38:39 PST 2010', + 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 03:54:37 PST 2009', + updateDate: 'Thu Feb 12 03:54:37 PST 2009', + accessDate: 'Tue Jan 05 01:38:39 PST 2010' + }, + '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': { + header: '####', + data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==', + version: '0.3', + creationDate: 'Thu Feb 12 03:45:43 PST 2009', + updateDate: 'Thu Feb 12 03:45:43 PST 2009', + accessDate: 'Thu Feb 12 03:45:43 PST 2009' + }, + '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': { + header: '####', + data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==', + version: '0.3', + creationDate: 'Thu Feb 12 03:47:39 PST 2009', + updateDate: 'Thu Feb 12 03:47:39 PST 2009', + accessDate: 'Thu Feb 12 03:47:39 PST 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 07:51:17 PDT 2007', + updateDate: 'Wed Apr 25 02:14:05 PDT 2007', + accessDate: 'Tue Jan 05 01:38:39 PST 2010', + 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 07:51:17 PDT 2007', + updateDate: 'Wed Mar 14 07:51:17 PDT 2007', + accessDate: 'Wed Apr 25 01:37:27 PDT 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 01:39:26 PDT 2007', + updateDate: 'Wed Apr 25 01:39:26 PDT 2007', + accessDate: 'Wed Apr 25 01:39:26 PDT 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 02:14:05 PDT 2007', + updateDate: 'Wed Apr 25 02:14:05 PDT 2007', + accessDate: 'Tue Jan 05 01:38:39 PST 2010' + }, + '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 01:51:49 PDT 2007', + updateDate: 'Wed Apr 25 01:51:49 PDT 2007', + accessDate: 'Wed Apr 25 01:51:49 PDT 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 02:01:21 PDT 2007', + updateDate: 'Wed Apr 25 02:01:21 PDT 2007', + accessDate: 'Wed Apr 25 02:01:21 PDT 2007' + }, + 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': { + header: '####', + data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=', + version: '0.2', + creationDate: 'Wed Apr 25 01:59:57 PDT 2007', + updateDate: 'Wed Apr 25 01:59:57 PDT 2007', + accessDate: 'Wed Apr 25 01:59:57 PDT 2007' + }, + 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': { + header: '####', + data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+', + version: '0.2', + creationDate: 'Wed Apr 25 01:38:17 PDT 2007', + updateDate: 'Wed Apr 25 01:38:17 PDT 2007', + accessDate: 'Wed Apr 25 01:38:17 PDT 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 01:56:58 PDT 2007', + updateDate: 'Wed Apr 25 01:56:58 PDT 2007', + accessDate: 'Wed Apr 25 01:56:58 PDT 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 01:58:33 PDT 2007', + updateDate: 'Wed Apr 25 01:58:33 PDT 2007', + accessDate: 'Wed Apr 25 01:58:33 PDT 2007' + } + } + }, + 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 08:06:54 PDT 2007', + updateDate: 'Tue Apr 17 10:23:41 PDT 2007', + accessDate: 'Tue Jan 05 01:38:42 PST 2010', + 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 09:27:40 PDT 2007', + updateDate: 'Wed Mar 14 09:27:40 PDT 2007', + accessDate: 'Wed Mar 14 11:00:21 PDT 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 08:09:07 PDT 2007', + updateDate: 'Wed Mar 14 08:09:07 PDT 2007', + accessDate: 'Wed Mar 14 08:39:40 PDT 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 11:01:05 PDT 2007', + updateDate: 'Wed Mar 14 11:01:05 PDT 2007', + accessDate: 'Tue Apr 17 10:20:33 PDT 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 09:17:20 PDT 2007', + updateDate: 'Wed Mar 14 09:17:20 PDT 2007', + accessDate: 'Wed Mar 14 09:22:06 PDT 2007' + }, + 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': { + header: '####', + data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg', + version: '0.2', + creationDate: 'Wed Mar 14 08:06:54 PDT 2007', + updateDate: 'Wed Mar 14 08:06:54 PDT 2007', + accessDate: 'Wed Mar 14 08:06:54 PDT 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 10:23:41 PDT 2007', + updateDate: 'Tue Apr 17 10:23:41 PDT 2007', + accessDate: 'Tue Jan 05 01:38:42 PST 2010' + }, + 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': { + header: '####', + data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC', + version: '0.2', + creationDate: 'Tue Apr 17 10:22:08 PDT 2007', + updateDate: 'Tue Apr 17 10:22:08 PDT 2007', + accessDate: 'Tue Apr 17 10:22:08 PDT 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 08:36:20 PDT 2007', + updateDate: 'Mon Jul 09 06:10:15 PDT 2007', + accessDate: 'Tue Jan 05 01:38:40 PST 2010', + 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 08:51:02 PDT 2007', + updateDate: 'Wed Mar 14 08:51:02 PDT 2007', + accessDate: 'Wed Mar 14 08:51:02 PDT 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 06:10:15 PDT 2007', + updateDate: 'Mon Jul 09 06:10:15 PDT 2007', + accessDate: 'Tue Jan 05 01:38:40 PST 2010' + }, + '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 04:56:43 PDT 2007', + updateDate: 'Wed Mar 21 04:56:43 PDT 2007', + accessDate: 'Wed Apr 25 00:59:58 PDT 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 02:26:44 PDT 2007', + updateDate: 'Sat May 19 02:26:44 PDT 2007', + accessDate: 'Mon Jul 09 06:08:39 PDT 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 08:38:54 PDT 2007', + updateDate: 'Wed Mar 14 08:38:54 PDT 2007', + accessDate: 'Wed Mar 14 08:38:54 PDT 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 08:36:20 PDT 2007', + updateDate: 'Wed Mar 14 08:36:20 PDT 2007', + accessDate: 'Wed Mar 14 08:38:12 PDT 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 01:04:29 PDT 2007', + updateDate: 'Wed Apr 25 01:04:29 PDT 2007', + accessDate: 'Sat May 19 02:22:01 PDT 2007' + }, + 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': { + header: '####', + data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5', + version: '0.2', + creationDate: 'Wed Mar 14 08:52:12 PDT 2007', + updateDate: 'Wed Mar 14 08:52:12 PDT 2007', + accessDate: 'Wed Mar 21 04:16:29 PDT 2007' + } + } + }, + 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': { + data: 'CPY8iR/pjIj9RJQLodhZzqAHNxzEvqIrpTemeMh+7RmJ5TfWVJ9n8dJuEntoOd3NbNYP9mGEzytvBKxTFtQ8xxD/c03RfdQwMFuYAaCrHdNineK/hzeETNF6siCdiUFnCgyluUT8eLtMKOPvZJKpP3iei5GNnQJMbeLvM/yRmnLyNiHFBPgi8fx9bYLE4XqPP+e6RgFC1UkKJLeeVgGY+qid1LycKqEklQc6OH9JzLFPKUeu56xINyOzPrR4hPJg0fKIboy7EkPnXXn6bXWUsqzcFNBvubdDi4VPeKcEbcR2JDGACInJNDxVO7EobRzvycrT0UQnWPgRgj3cBKZPBrXN7ntdt8C7ceokHhEcmW3u7C96lMYFIm4cCeN5bGpJe8Hw4kc+zOT3RnDFqNTCg5nW6TTYbdOWOkZ9PpizPB094Etiz0bIoH9uUomMqKYGZagXBm0b7O8irSh9hXKdS58jH+UisXy03Vvf2hNZceIM6rpyLRhPhM9n3B5AaUD6X4JGyaTy9odGxKpCqzLeDqYo2wWfVtV3822uJqdrO8c1HHM5CSAQZm7ni9U9kwHAHIdt/UwuGDORmNBchEgv02tE8qnoAD7lWeB92VSv84J+NQ+v8js7/AgQFLjXdjuCGY5ouzriURf2HIA2NIy1dnfX9UiAqNn4bP9upU/8UAILSoHVou7zdINCDgWCupJkA+Dbl2nl4PC2rFpAfqDCPlV3L3UAqIU5V/SxchN8vdkdOLE0xjMn5dHvud5fUMZgXSF3Q/h1Ouf+4EU81Fgc/cjy9WLYGEk+dFLOCy2CQDlBfsQZBD1vvfg8UACcjK/f7DjGF9NZAGzFeSBNB+a66uZhGpd5MOhtJGm8CCITh/883QaRTxKqaVfPe+VtCTYYtVeZWTGAut01fFae1iNTSkgN2rlK38boZ2DbiRaA9jDvhTuH7IISLlBNUCeIkfTrWEMVndoj53lApX2eJ79DvmtB+WHuh1AklO1SOZ3eOXDw4oWpFFuBNO8HqKccPRce4HI3KFE6AVFzDoIT82MnxbfcsSpbtZyhZPTlZ2+mUd2e3HETD50KAkr9TFAa3geJi4rCfnlf95c2vb6D43wUrE+X6+44C/FqCvtym3yH9F4Fy79gFrZk+303KpcfcwheNLT3yLqgGe0FoJToSUPrZkgQb2MFh12B3X+uHClM6EoZInn1vSQSaNQvg4a6W3KT5WVhszgfKXdGFieil9LFZtf5TIX/xVGHuUtmgPrJMadjoZDSF6XW', + version: '0.3', + creationDate: 'Wed Mar 14 08:20:58 PDT 2007', + updateDate: 'Fri Dec 18 09:50:20 PST 2009', + accessDate: 'Tue Jan 05 01:38:41 PST 2010', + 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 08:45:40 PDT 2007', + updateDate: 'Wed Mar 14 08:45:40 PDT 2007', + accessDate: 'Wed Mar 14 08:45:40 PDT 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 08:47:01 PDT 2007', + updateDate: 'Wed Mar 14 08:47:01 PDT 2007', + accessDate: 'Tue Jan 05 01:38:41 PST 2010' + }, + 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': { + header: '####', + data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=', + version: '0.2', + creationDate: 'Wed Mar 14 08:20:58 PDT 2007', + updateDate: 'Wed Mar 14 08:20:58 PDT 2007', + accessDate: 'Wed Mar 14 08:43:46 PDT 2007' + } + } + }, + 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 05:35:58 PDT 2007', + updateDate: 'Thu May 10 06:01:21 PDT 2007', + accessDate: 'Tue Jan 05 01:38:37 PST 2010', + 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 05:35:58 PDT 2007', + updateDate: 'Wed Mar 14 05:35:58 PDT 2007', + accessDate: 'Wed Mar 14 05:35:58 PDT 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 11:24:49 PDT 2007', + updateDate: 'Wed Mar 14 11:24:49 PDT 2007', + accessDate: 'Wed Mar 14 11:24:49 PDT 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 09:41:15 PDT 2007', + updateDate: 'Wed Mar 14 09:41:15 PDT 2007', + accessDate: 'Wed Mar 14 09:41:15 PDT 2007' + }, + '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': { + header: '####', + data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=', + version: '0.2', + creationDate: 'Wed Mar 14 11:25:28 PDT 2007', + updateDate: 'Wed Mar 14 11:25:28 PDT 2007', + accessDate: 'Thu May 10 06:00:47 PDT 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 06:46:36 PDT 2007', + updateDate: 'Wed Mar 14 06:46:36 PDT 2007', + accessDate: 'Wed Mar 14 09:40:01 PDT 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 06:01:21 PDT 2007', + updateDate: 'Thu May 10 06:01:21 PDT 2007', + accessDate: 'Tue Jan 05 01:38:37 PST 2010' + }, + '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 09:43:29 PDT 2007', + updateDate: 'Wed Mar 14 09:43:29 PDT 2007', + accessDate: 'Wed Mar 14 11:23:51 PDT 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 09:39:39 PDT 2007', + updateDate: 'Wed Feb 13 06:29:04 PST 2008', + accessDate: 'Tue Jan 05 01:19:18 PST 2010', + 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 09:39:39 PDT 2007', + updateDate: 'Wed Mar 14 09:39:39 PDT 2007', + accessDate: 'Tue Apr 17 10:09:44 PDT 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 10:12:39 PDT 2007', + updateDate: 'Tue Apr 17 10:12:39 PDT 2007', + accessDate: 'Wed Feb 13 06:27:04 PST 2008' + }, + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=', + version: '0.3', + creationDate: 'Wed Feb 13 06:29:04 PST 2008', + updateDate: 'Wed Feb 13 06:29:04 PST 2008', + accessDate: 'Tue Jan 05 01:19:18 PST 2010' + }, + '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': { + header: '####', + data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=', + version: '0.3', + creationDate: 'Wed Feb 13 06:28:28 PST 2008', + updateDate: 'Wed Feb 13 06:28:28 PST 2008', + accessDate: 'Wed Feb 13 06:28:28 PST 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 10:11:33 PDT 2007', + updateDate: 'Tue Apr 17 10:11:33 PDT 2007', + accessDate: 'Tue Apr 17 10:11:33 PDT 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 10:43:29 PDT 2007', + updateDate: 'Wed Mar 14 10:43:29 PDT 2007', + accessDate: 'Fri Jan 08 12:44:56 PST 2010', + 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 10:43:29 PDT 2007', + updateDate: 'Wed Mar 14 10:43:29 PDT 2007', + accessDate: 'Fri Jan 08 12:44:56 PST 2010' + } + } + } + } + } + } + + }, + + //------------------------------------------------------------------------- + 'syntaxFix': "" +} diff --git a/frontend/gamma/tests/tests/Components/FullApp/index.html b/frontend/gamma/tests/tests/Components/FullApp/index.html new file mode 100644 index 0000000..d42d112 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/FullApp/index.html @@ -0,0 +1,243 @@ + + + + + Clipperz - online password manager - debug + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
keep it to yourself!
+

loading ...

+
+ + + +
+
+ + +
+
+
+
+
+ +
+

Attention!

+

If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.

+

Javascript is required to access Clipperz.

+
Please enable scripting or upgrade your browser.
+
+
+ +
+
+ + + + diff --git a/frontend/gamma/tests/tests/Components/FullApp/main_test.js b/frontend/gamma/tests/tests/Components/FullApp/main_test.js new file mode 100644 index 0000000..fa21581 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/FullApp/main_test.js @@ -0,0 +1,114 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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 shouldShowRegistrationForm; + var useCompactDesign; + var controllerParameters; +// var iPhoneDesign; + +// MochiKit.Signal.connect(document.body, 'onkeydown', _pm_logEvent); +// MochiKit.Signal.connect(document.body, 'onkeypress', _pm_logEvent); +// MochiKit.Signal.connect(document.body, 'onclick', _pm_logEvent); + + controllerParameters = {}; + + MochiKit.DOM.removeElement('javaScriptAlert'); + Clipperz.PM.Strings.Languages.initSetup(); + + if (window.location.search.indexOf('registration') != -1) { + shouldShowRegistrationForm = true; + } else { + shouldShowRegistrationForm = false; + } + + if (window.location.search.indexOf('autocomplete') != -1) { + controllerParameters['autocomplete'] = 'on' + } + +// if ((window.location.search.indexOf('iPhone') != -1) || (navigator.userAgent.match('iPhone'))) { +// iPhoneDesign = true; +// } else { +// iPhoneDesign = false; +// } + + if (window.location.search.indexOf('compact') != -1) { + useCompactDesign = true; + } else { + useCompactDesign = false; + } + + if (useCompactDesign == true) { + Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Compact.Controllers.MainController(controllerParameters); +// } else if (iPhoneDesign == true) { +// Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.iPhone.Controllers.MainController(); + } else { + Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.Web.Controllers.MainController(controllerParameters); + } + + Clipperz.PM.RunTime.mainController.run(shouldShowRegistrationForm); + +//Clipperz.log("HASH: " + window.location.hash); +// if (window.location.hash != "") { +// window.location.hash = "" +// } +//Clipperz.log("HASH cleaned"); +// #credentials=base64encoded({username:'joe', passphrase:'clipperz'}) +// MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'}); +} + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); + +var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); +proxy.dataStore().setupWithEncryptedData(testData['testData']); + +MochiKit.DOM.addLoadEvent(run); diff --git a/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js b/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js new file mode 100644 index 0000000..1c06468 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/GridLayout/GridLayout_test.js @@ -0,0 +1,119 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.GridLayout'); + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Clipperz.PM.Strings.Languages.initSetup(); + +Clipperz.Tests.GridLayout.Tester = function(args) { + args = args || {}; + + Clipperz.Tests.GridLayout.Tester.superclass.constructor.call(this, args); +//# this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + this._user = new Clipperz.PM.DataModel.User({username:'joe', getPassphraseFunction:function () { return 'clipperz';}}); + + return this; +}; + +Clipperz.Base.extend(Clipperz.Tests.GridLayout.Tester, Object, { + + 'toString': function() { + return "Clipperz.Tests.GridLayout.Tester"; + }, + + //------------------------------------------------------------------------- + + 'user': function () { + return this._user; + }, + + //------------------------------------------------------------------------- + + 'run': function () { + var deferredResult; + var proxy; + var cardDialogController; + var cardDialogComponent; + var component; + var filterController; + var cardsController; + + filterController = new Clipperz.PM.UI.Web.Controllers.FilterController(); + cardsController = new Clipperz.PM.UI.Web.Controllers.CardsController({'filterController':filterController}); + + component = new Clipperz.Tests.GridLayout.TestPageComponent({element:MochiKit.DOM.getElement('component')}); + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + + deferredResult = new Clipperz.Async.Deferred("GridLayout_test.init", {trace:false}); +//# deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']); + deferredResult.addMethod(this.user(), 'login'); + + deferredResult.addMethod(cardsController, 'run', {slot:component.slotNamed('cardList'), user:this.user()}); +// deferredResult.addMethod(xxxxController, 'run', {slot:component.slotNamed('cardGrid'), user:this.user()}); + + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'saveChanges': function () { + return this.user().saveChanges(); + }, + + //------------------------------------------------------------------------- + + 'hasPendingChanges': function () { + return this.user().hasPendingChanges(); + }, + + //------------------------------------------------------------------------- + + 'revertChanges': function () { + return this.user().revertChanges(); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + + + +init = function () { + var tester; + + tester = new Clipperz.Tests.GridLayout.Tester(); + tester.run(); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js b/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js new file mode 100644 index 0000000..a98f041 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/GridLayout/TestPageComponent.js @@ -0,0 +1,102 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.GridLayout'); + +Clipperz.Tests.GridLayout.TestPageComponent = function(args) { + args = args || {}; + Clipperz.Tests.GridLayout.TestPageComponent.superclass.constructor.call(this, args); + + this._element = args.element || null; + + this._slots = { + 'cardList' : this.getId('cardList'), + 'cardGrid' : this.getId('cardGrid') + }; + + this.render(); + + + return this; +} + +//============================================================================= + +Clipperz.Base.extend(Clipperz.Tests.GridLayout.TestPageComponent, Clipperz.PM.UI.Common.Components.BaseComponent, { + + //------------------------------------------------------------------------- + + 'toString': function () { + return "Clipperz.Tests.GridLayout.TestPageComponent component"; + }, + + //------------------------------------------------------------------------- + + 'renderSelf': function(/*aContainer, aPosition*/) { + this.append(this.element(), [ + {tag:'ul', cls:'testTabs', style:'', children:[ + {tag:'li', id:this.getId('list'), children:[{tag:'span', html:'list'}]}, + {tag:'li', id:this.getId('grid'), children:[{tag:'span', html:'grid'}]} + ]}, + {tag:'ul', cls:'testPanels', children:[ + {tag:'li', id:this.getId('listPanel'), children:[ + {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[ + {tag:'div', id:this.getId('cardList'), cls:'gridComponent cardGrid'} + ]} + ]}, + {tag:'li', id:this.getId('gridPanel'), children:[ + {tag:'div', /*id:this.getId('mainPanels'),*/ cls:'mainPanels', children:[ +// {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'} + {tag:'h1', html:"Ciao"} + ]} + ]} + ]} + ]); + +// this.append(this.element(), {tag:'div', id:this.getId('mainPanels'), cls:'mainPanels'}); +// this.append(this.getId('mainPanels'), {tag:'div', id:this.getId('cardGrid'), cls:'gridComponent cardGrid'}); + + new Clipperz.PM.UI.Common.Controllers.TabPanelController({ + component:this, + configuration: { + 'LIST': { + tab: 'list', + panel: 'listPanel' + }, + 'GRID': { + tab: 'grid', + panel: 'gridPanel' + } + } + }); + }, + + //------------------------------------------------------------------------- + + __syntaxFix__: "syntax fix" +}); diff --git a/frontend/gamma/tests/tests/Components/GridLayout/User.data.js b/frontend/gamma/tests/tests/Components/GridLayout/User.data.js new file mode 100644 index 0000000..6fec8c9 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/GridLayout/User.data.js @@ -0,0 +1,977 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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 PDT 2007', + updateDate: 'Wed Mar 14 15:46:44 PDT 2007', + accessDate: 'Mon Jan 19 16:10:04 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 15:46:44 PDT 2007', + accessDate: 'Mon Jan 19 16:10:04 PDT 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 PDT 2008', + updateDate: 'Mon Oct 27 08:58:49 PDT 2008', + accessDate: 'Mon Jan 19 16:09:39 PDT 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 PDT 2008', + updateDate: 'Fri Oct 17 17:00:31 PDT 2008', + accessDate: 'Fri Oct 17 17:00:31 PDT 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 PDT 2008', + updateDate: 'Fri Oct 17 16:49:20 PDT 2008', + accessDate: 'Fri Oct 17 16:54:23 PDT 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 PDT 2008', + updateDate: 'Fri Oct 17 17:00:13 PDT 2008', + accessDate: 'Fri Oct 17 17:00:13 PDT 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 PDT 2008', + updateDate: 'Fri Oct 17 16:59:31 PDT 2008', + accessDate: 'Fri Oct 17 16:59:31 PDT 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 PDT 2008', + updateDate: 'Mon Oct 27 08:58:49 PDT 2008', + accessDate: 'Mon Jan 19 16:09:39 PDT 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 PDT 2008', + updateDate: 'Fri Oct 17 16:57:17 PDT 2008', + accessDate: 'Fri Oct 17 16:57:17 PDT 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 PDT 2008', + updateDate: 'Fri Oct 17 16:58:00 PDT 2008', + accessDate: 'Fri Oct 17 16:58:00 PDT 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 PDT 2008', + updateDate: 'Fri Oct 17 17:01:59 PDT 2008', + accessDate: 'Mon Oct 27 08:57:58 PDT 2008' + } + } + }, + '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 14:53:11 PDT 2007', + updateDate: 'Tue Apr 17 19:17:52 PDT 2007', + accessDate: 'Mon Jan 19 16:09:25 PDT 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 PDT 2007', + updateDate: 'Tue Apr 17 19:13:41 PDT 2007', + accessDate: 'Tue Apr 17 19:13:41 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 14:53:11 PDT 2007', + accessDate: 'Wed Mar 14 15:24:35 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 15:33:00 PDT 2007', + accessDate: 'Tue Apr 17 19:12:56 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 15:26:35 PDT 2007', + accessDate: 'Wed Mar 14 15:26:35 PDT 2007' + }, + '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': { + header: '####', + data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==', + version: '0.2', + creationDate: 'Wed Mar 14 15:30:09 PDT 2007', + updateDate: 'Wed Mar 14 15:30:09 PDT 2007', + accessDate: 'Wed Mar 14 15:30:09 PDT 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 PDT 2007', + updateDate: 'Tue Apr 17 19:17:52 PDT 2007', + accessDate: 'Mon Jan 19 16:09:25 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 15:27:35 PDT 2007', + accessDate: 'Wed Mar 14 15:27:35 PDT 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 PDT 2007', + updateDate: 'Tue Apr 17 19:15:09 PDT 2007', + accessDate: 'Tue Apr 17 19:17:01 PDT 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 PDT 2007', + updateDate: 'Mon Oct 27 09:16:14 PDT 2008', + accessDate: 'Mon Jan 19 16:09:35 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 18:39:55 PDT 2007', + accessDate: 'Mon Oct 27 09:07:56 PDT 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 PDT 2008', + updateDate: 'Mon Oct 27 09:09:11 PDT 2008', + accessDate: 'Mon Oct 27 09:15:58 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 18:39:35 PDT 2007', + accessDate: 'Wed Mar 14 18:39:35 PDT 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 PDT 2008', + updateDate: 'Mon Oct 27 09:16:14 PDT 2008', + accessDate: 'Mon Jan 19 16:09:35 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:01:24 PDT 2007', + accessDate: 'Mon Jan 19 16:10:11 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:01:24 PDT 2007', + accessDate: 'Mon Jan 19 16:10:11 PDT 2009' + } + } + }, + '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': { + data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==', + version: '0.3', + creationDate: 'Mon Jan 05 17:45:25 PDT 2009', + updateDate: 'Mon Jan 05 17:45:25 PDT 2009', + accessDate: 'Mon Jan 19 16:10:21 PDT 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 PDT 2009', + updateDate: 'Mon Jan 05 17:45:25 PDT 2009', + accessDate: 'Mon Jan 19 16:10:21 PDT 2009' + } + } + }, + '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': { + data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=', + version: '0.2', + creationDate: 'Tue Apr 17 16:36:08 PDT 2007', + updateDate: 'Tue Apr 17 16:36:08 PDT 2007', + accessDate: 'Mon Jan 19 16:09:33 PDT 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 PDT 2007', + updateDate: 'Tue Apr 17 16:36:08 PDT 2007', + accessDate: 'Mon Jan 19 16:09:33 PDT 2009' + } + } + }, + '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': { + data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=', + version: '0.2', + creationDate: 'Mon Apr 02 19:12:44 PDT 2007', + updateDate: 'Mon Apr 02 19:12:44 PDT 2007', + accessDate: 'Mon Jan 19 16:10:08 PDT 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 PDT 2007', + updateDate: 'Mon Apr 02 19:12:44 PDT 2007', + accessDate: 'Mon Jan 19 16:10:08 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 19:09:05 PDT 2007', + accessDate: 'Mon Jan 19 16:10:15 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 19:09:05 PDT 2007', + accessDate: 'Mon Jan 19 16:10:15 PDT 2009' + } + } + }, + '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': { + data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==', + version: '0.3', + creationDate: 'Mon Jan 05 17:44:30 PDT 2009', + updateDate: 'Mon Jan 05 17:44:30 PDT 2009', + accessDate: 'Mon Jan 19 16:10:18 PDT 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 PDT 2009', + updateDate: 'Mon Jan 05 17:44:30 PDT 2009', + accessDate: 'Mon Jan 19 16:10:18 PDT 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 PDT 2007', + updateDate: 'Tue May 01 01:13:27 PDT 2007', + accessDate: 'Mon Jan 19 16:10:02 PDT 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 PDT 2007', + updateDate: 'Tue May 01 01:10:17 PDT 2007', + accessDate: 'Tue May 01 01:10:17 PDT 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 PDT 2007', + updateDate: 'Tue May 01 01:13:27 PDT 2007', + accessDate: 'Mon Jan 19 16:10:02 PDT 2009' + } + } + }, + '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': { + data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=', + version: '0.2', + creationDate: 'Wed Mar 21 16:29:06 PDT 2007', + updateDate: 'Wed Mar 21 16:29:06 PDT 2007', + accessDate: 'Mon Jan 19 16:10:01 PDT 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 PDT 2007', + updateDate: 'Wed Mar 21 16:29:06 PDT 2007', + accessDate: 'Mon Jan 19 16:10:01 PDT 2009' + } + } + }, + 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': { + data: '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', + version: '0.3', + creationDate: 'Thu Feb 12 12:45:43 PDT 2009', + updateDate: 'Thu Feb 12 12:54:37 PDT 2009', + accessDate: 'Thu Feb 12 12:54:37 PDT 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 PDT 2009', + updateDate: 'Thu Feb 12 12:54:37 PDT 2009', + accessDate: 'Thu Feb 12 12:54:37 PDT 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 PDT 2009', + updateDate: 'Thu Feb 12 12:45:43 PDT 2009', + accessDate: 'Thu Feb 12 12:45:43 PDT 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 PDT 2009', + updateDate: 'Thu Feb 12 12:47:39 PDT 2009', + accessDate: 'Thu Feb 12 12:47:39 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 11:14:05 PDT 2007', + accessDate: 'Mon Jan 19 16:10:12 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 15:51:17 PDT 2007', + accessDate: 'Wed Apr 25 10:37:27 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 10:39:26 PDT 2007', + accessDate: 'Wed Apr 25 10:39:26 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 11:14:05 PDT 2007', + accessDate: 'Mon Jan 19 16:10:12 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 10:51:49 PDT 2007', + accessDate: 'Wed Apr 25 10:51:49 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 11:01:21 PDT 2007', + accessDate: 'Wed Apr 25 11:01:21 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 10:59:57 PDT 2007', + accessDate: 'Wed Apr 25 10:59:57 PDT 2007' + }, + 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': { + header: '####', + data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+', + version: '0.2', + creationDate: 'Wed Apr 25 10:38:17 PDT 2007', + updateDate: 'Wed Apr 25 10:38:17 PDT 2007', + accessDate: 'Wed Apr 25 10:38:17 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 10:56:58 PDT 2007', + accessDate: 'Wed Apr 25 10:56:58 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 10:58:33 PDT 2007', + accessDate: 'Wed Apr 25 10:58:33 PDT 2007' + } + } + }, + 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': { + data: '7x7+2tk+I8+OchrmpfLJhDR2crUWfHDo/E8TdmVxbMH9fsnqG4azJG/xVbWROw8N0v8ahhBY3BJG9de9L6PH9B+wECx9zRx/udStcStKRpJLCcjWxVVMt/ipJ+/QqFKWZptqs7VkiT4jZw0V3I4Tl7Wt82/PWZ/euyzYOau+YtiflSedG7+7aEEbhDblntf7NbSXCTIXVnAZw/xuyMjxmioJNNe4sA+fls8KZSYYAzpvxl9+h+esPm978SN/+IuG3mDzCHS+V0tmEhr4v2yfWsZ5axAZFjQSu6TaLNvdFmvgF2olddkizXBsov12WlMSQDSEhs/xkv5ZXVLK3JOCDJldW80eLs0vGOSOJZL3r7NO1gRiwnX5K8PM3YowFIFkWNavRy/B4RneSNCo8XqEg8lBBiJbTtExxMByLKjifcKP7xAD2VeByJ0XDo5If+J4fGiYjo9XU/Bkc2POnJQt+SnNN5iAw493AtGDdPMO37RFRCAeU3W0vR1unsaD9Xn+ClPj1jNCXWZDtvwWnoke8XCeDeTIAzh3wXMCs7ZRqfAHwA1UWOqIq4DP0RJaWeIXCWYSRYAWLnteX1EzHixkvh4MMKmA09bbH/SS5gB6P/V7BBiwxKgstU3tyBbA2bW8aUG1zNthaOtbVqj9YbyogEMN5f3r4I0eMAZDKkbD6med1bHm6P0Zlr0MIYFIgiLkZvEjfoVkuQmFpM1N/PAlEeVDD97VZG9bGN006wdIsR2TEStymt4aBTIyZ+AKDKiGAARYPyYBTswPIAzKBfUipJ7milktKHHmj6LdsDMrwIf5ZQLqvAm2v7xMMBLWTJI+ieGi/R1UgvKAzyGQwzQFB2x+ljNQHsC3wnTLm7/y87CE0FB39FZVC2NJETmWUmAmltL9CPs1Wr6tkin6e2CzSvf5EGsKWBMDkHZD08vjLd30+BxbfS8cuWS3BpTzZ481qjqsF5hDtyRgHQ2eXXggc9imQCvNdG13yNOCcN2KUMPWvPhik6pV7HIMPI2ncPegtCVYwfDFHCn2AV+K1j0G1JIPzRxPlXBX/XNK9kyyK7R3xO7vC3VQyMzPGp8Br5vmoP2356lLLvR5JT7j/uXwZTP1H2/cZSLOii44OXiSNQ8OKp8SIzcWpAd+IuQ7zp2TKOSTl8IEbnorNnJdOG1FbT9kF3FlWkjT6LmQM6Y6pwsYPWinjth72RpTTMBAg6XXr7jveONdFOhoQBjD+VDkF5mv9MqANwv+1HSxwd3SI2OuTsoUcaHzpvquixf6BF2mctDX70i1Nx0gsnBzwsAa3hMQ924fEUyt2XQbJi+3HJ+C5qakgfZ2ERq/MaUL3aSUEL2ViuBly7ObM9/E9NQKyRySXGXb6e1ZdFlajhWLw/N4UpZQVXuQOX/0i95lWQsGbc8aeEn5kh5+Mwruxh8cIBVywiet34O5smc0bdoSWgXdaHZZ2OhJpP26gcDmsYQQPhUUpkhdipRTuNMoWDpy7T2Z36otFZYSRY7tUF7Wmh4zcXxgm8nBbxD3m63ll5MQXIfsR6KL+Ai+81U19VEd224+SdtHd8LP2kbQTRzNvDI2HJdw3GRsdkhyVRFR2NCdoseUfLGqOVxNt/XiWha8r70JOBpe+otSStF5pM92FHHsLqPIEakPqaEXL6IYJa1C9kLjMTjmQNig/biF1X3vQAne1maUvuAGx+6sdUU+GNIpw+AdjilUoRLsFwIMiwLxQLc4dY/97AEdbaC4pNYFW80ch0Joq54IYdmZwv4A08mD7yDGuWxBSyJV4Ylo9nI5ZofpW4Bw2HaG6L3Qx+207Y54WbYjZvmPUdLjItjQWgbJVPfvYi18zaqfbHFulrhKk4MM12oc0OBqt9nl6HHNKHhoHULDMR3B09B4luV1uziY0JudV7ePlCaLd3BDF/y1ujXFPJm3GLkjsaXY/rargrHuiIgKz1FJPuEXKq9admZmS0YgsGkRAgP3RwxpwJoCBuvV1XsFAYJNnz07VjaGvtTazGg5tlfITyF3tZ9m+GAeWR7dObhBOIxR60JddSz/61Zy95BfUOgpuhXYaVuZNFVxYTWcsDFy6Rn4TJN36FfZ6SaNiDQmWK0nhXiphNAzFTDvOBCZdXj0hwSNibD93fMrnphbjmpRfuhLk9MVLupB0FcuW6gGcJENbLKHaJYzRk1LTqXkZ70BCNoSt0HHUgaxj6S0gYVgWa5iqB4HS2vB2gr3B4iEezUWYG5gZsbCcC/H0bvPsSiNpelHrApPgrhGatR5ZwyLt9tnpVTxq6Uw1DkgVdEYrVBUftA9WB02R/cPD0T4K3VqyEaixODGpRWj3RcmUlHT9LwTlVmX9zABKxyIe6Zaq1Chk6mfDPgBzgai4yoUlLQulgayxG3GFc8oZRAm/kOjsY2E+/OpVPtKGzPGR7i4dSK+c+/GTJZykDu6w5FGznNo8YYKB6fvSi0nsTdUSBxBcYgFs81Lkvh/iBf3ZgA4XT9tvHls8VDOKHS7Uz5B7yr13pzVUDJLPQnlbDusmiAKgoloq89ASV2XdmUB50RxeKk1yuMfSVNqXSRxHB7xcQAsnJKaPTvkc1Dikv0K8g6uFSOlN6PXqOJU5SEwkDVsG7OBAWw9aiRC+IKwquOvzejh1Cbu11yMYlPpPtSydMoOEwAKoeoT0XdGVDXP2ySOYpVuW3i8wceWQLg2BYHIlWUzX0CIN0HZbvw5v+ptTzDXT+tp3AtlRzmGKXRVBvdtyUn/38abZ/Qwm5Uzw2jtXc0ol7ce9SMpJb83wpJbQGVTrDUrevFw+vh2x093yS7xNRJS+XNKnfZVG8WahWTdD2VRilgQ/GNILKjAT22XC0kW/+MxBReazixYCMU/vp7fJ2/2i3Th2X6ZlvzVeR+0jd1lp+Y/8//iLFpNn/WCkIKZQk1gVlVlzlY889hORm/SJd2J08ODQ4qCJS4ncYzu/xxikyjd2q+9wb38UHIIOx+qlop36QXaCraduzD5ZO2GHKZBWlJG0nBWxli6BMc6CIQdTKAAm3xnDP0wsIUPhey4u2+HoqC+znZeXTDVwl9n1oxzXsgpHsUlRCHG2pUGF/nGGe/r6/PQ3viSz5I5XUPWy0yOoy6I+NYQCanjcYtFvbcNTDrFmIkQPpf2kFslGlfINGgRlLTIjoYcSx/Xp11FGGwG/1tOKuUzDUAY2dMmFiGGkkxlHL71Z6BFAWj547krybEyCujhtNDCex8htVlI6GH4RxoVyBmw6cO+LV6TO63ieZWrFJGyQ0hd0ikh4A77NZi4+0rEsa1nC4DBm47z3CiLsXH+IlPi3MiBKUVb0MGHcLSvDokCZ4iFsdaMx3Cvkne0Ym8v0i8ImhWa8oJzmC7VQBSCs3gxCs9bENWShhlPs8JJId2vpn5LzsYp913gtD4PthRUGUAa+9cPzQ6V4qQgpzkX0KmV8VRbElDlR1Q4FRC4Cu7ULf8YTSof/Ko2I0iJlH/EmtM+BQO+zf0MohRvDPzEkKeHFhgbUSjcYls/NWU5oK5dOdbP8Sg2AryTySVmMiJd0Eefu6YnjJaLS3++mM1tOHKucCStqhehFL/Jo63qcHbe1jGvAdbKHk6WVHn4DX3DbT3U1awpfEVHRxNG0/IWu/6G2RDx++pi5KcmBIp40gkd4Exv/k2BK/gFs1HXBt8OXS858W0yWDsAl6z9zbzg1JfUvmrfhFLMNN5jls0AITqvo3rHaA4gVUjswUJmsJdElncyRHkTYuE0lbr9Fv5ELkQePYfhyGwKKJpRYdtNZ2f54rAMy5r/Pei1pn0ag6m5jcYzzM8NVIrJSYwsHsghphpkJw7Fxtme8hgAMoD6lL4lGjC786IG9jsnmXnmV+Y491DDjCnOMTy/NTWm1RD+9vjXYxVaO46+0iYtIjk/e6cmFUEz/eGzphzglVXnAlBs569glfbuZrNriiGzd66Wq4lETelMy7sm3UUwL9n3RvGalQCuwxVLZf2oQdNRLnH1k8sKYJk1DtFNW8R3gTRyFQBx1FKYz5rtCKaobLQf7xn+Bnn4uBMtpVoxfsWnK7se3UIKutJuWH2PoetRft7fAcYzLSy9Oyy2fV2gR9OV+9p0HJAIPIKUMC8nVdLXXaggwns4cigSgOLN08gWpTlD39IZmBY8iA+l+bkJcDSFqD+T6hYTNxSXkSLy9Xve18tvYJqG4JvfBt7JwSdA+QwfiS9jIQdIWUs5cBl/ShX9IRmlhsZPF9sow5JAnGJNZhPBF0j9UJfDcgyw98E8wVuNHly5J2CneK1vigbZTM25KMnjevyN3PnfsFSkPjTw4wmMEJpGdMnzzVqA7etpitypyNbgjX0fsAWOgEIRQ5Sog498t6nF1SwWVy7R+0CdpZhh0GpyoNf2TFUklYRec+xRLbAZc5Bkj6Tm9Z/ex9Ssjhi23uL0XG1SCJbHrhox4F8LgLQD22wcnXoSTU4mPAY942u5o2nvB6CTQS8Mj5n+YipQ99UxDhii5UrliGHSdEgjugfHiSoxpkjhNxJSWErYOgWi/qadZqsB/FHLFfMDrhkKxjpcSZwzZO6fAtKiDM5teK6TWaGWwEutd/W/q0Px1vYWxnxHn1ryXx9O3ORe5JJ5FymN4SWkTBIC8eeWTUxQ3TSs2NoGPmN6SnpGFLZH2VLygpg56tE9nXJifXElP8TcIPGPvFGNZFLwtxcdoVbLZaS1IUTpExPGBQ6NUPH24cnWE3RoQrQQHaFcdE1+IRC3TKf+ajINV2LBMhdYI0yE5l5F9hI4GhHNsd/xzROx4NFqkSdVW6T0jFl4NhAUB0iSX2zwJ+yvaor69uzWIFW81n8T5iSPG7Q1naFLL6AOt56wLDUOkioi5CVYlt5lFEl0UtmFnM4j+/Nj+FCCo6jPil847/ZlAicGKXktmDG2nVGILKLe0MZAKdcni/RwBJnl6qSs5x6u2Z46HYi63t4c2RXlljJkHvrn9PuAIG4xSC041F9gaxEshFqg0+nZ5dNiza+DoWgltTHkJehK2UQLMAbRwyvURSz0zSwrUTuT1lBCoSR8/rP3M8PghvUQ6sHpcw1TJ7NwG5y9oS1UVKiU5xC9gHlsMyxfSEaySkhdD5tVOCeGmOzKCD+vx8C577HZaNskKN6KxB3o+DvF6KOAjrtWvZ7C7r1JF7COugUoBSGrp/CeXtvswFvxNc8bqGqEqEZehhl+4TnKrQ+M9LOyWYnkHqbAVt91tIaeNCZZT3wyP4ooZU+JbOogK50kn9LMeT3r7aqbYLY0T1KQH1eezt8tuaeHaKaMX8P7gpW3ucwTINqDlTHL+/wm42D5UfP+/8/jmD+OfHdi8riILye/fDH+BMbk2/syWF94/ZbxjSEWuNtKBEQZJS2PlxQvlqr5pwCcIOFfTE6afEzCjC8968aBhqXMmONQjiYTj+CGZAfivZQV/60o9ckLAXAJoFBiBNf85l7M8DBfmRyabNCQMldus0zvBX6tptH8EuGL4wRPC5vReeigzpcaP8zbjOmvv8bOY6ZgDZTTfXiqOeSwCVUABEUfErNIzGizNu7iYCrbrPqSErrSC/8EmCqyqVbQ9qcN1VSJSAOJ4Vo4udeib5Zvu2zG5St9HWO/blRkKM9qn9s9i6ONSvn1bM8sp20cvAM3+/JVLD5nlCEqVe7oQ+uBCGLpgFJNj6lHiOqSjOm2OSvIbXq53l3IETF/r49OAKYQP8FkVpxrXmQS9Du9Fbp1u50BY9eSmzJuWOE8rOZhNbpaKIpMhdA7HYRmq7hX0bzDUHfKt9hbcrS89fzGikdlyTFmD2soGEbAwgjb4nFkYpzROVAjOhpfz3loAgZO5qpiXym/ee9gus0+OO6PM1xPkWUrTA8mnKvfiFO/ZJx3rn5g5+M/llzj41Cc7Ds0GtbWpUPhLzY7icmtNBamZf/uSUiSHXi6GCZ26llyX7bayCIVUpjg6ijelZQU3rkq42lVPByq8zmxECK8HjAyff6StsBAdIIexA9DN9psACVvybb8iYd09R1wPPFz3o5Gl5tSNV4f2brsPa5VAUyQdQ8YezWXIwZ9u3Q9vrls20FFfN697M+/Y9meu3hX3lVx93LTTsDCLVipaTJyq65n6lbOWZMQb5dgxtoBEKL3ZuxfeSTLiVgbzF3KqxyKNw8MwiyqcVO5mgZGwK9mHFFbSnUiPfHxBfBdqYzH07OksNb9/MvNYK+ebVj5yrEwT/EjNP5/3Bhe5cRUE3m7Y0WgS0TuYZiPgNYCak7ynZXOrYkNjLpH3Wc5GC4RnHXvwpBtD4yJaiIVt0lxYPvfik8FaRjQymubWA09j78ac9d5bKq40ERYLE9oTOoot26jEKoNSX7xqGQCU8VwAOQhC1HfKfdJ88uFMENnB2WLFGqHhZq444eS3Swc1OwBn5zSxUXLNZon9pinWObX8O8ULY1N5TTY8Qh9bLLfLjntCqXFXH8/6wcdnuOrBH0It6LLqrUm/TehuqXXL1c9Q1cYBLYrYjT0FJmbKrcyqG4peOxfCqEiryLLLcdSOECA4vDSvlo6eJ1sk1mXgF64ZEIIH7dZWlOl/eL0L6fGs/vrbvJBBArkVftkOiumIsXMwqaNtZYwMzX811NZpFMOhInwTmh8mbaaCpL+0ioizEE1/is5M9eA3808sF3Miv7d2RtI3sGWbdb9K/cVrOhV4Oy4MkdVxrZpeYuzshod3DRB3/Es72Z1ImrZh+div/GnWpo9Q9M9U/pLVuLnKVCPnXhu5dkF9nVse5NrcBlt7qQvvr/4CC0uctQ94nbjNZobcEXGSYZ8dx7Oftr7fKzT9cxhh93Zm/mxz48dys3JD1JB2V/OZfPoiiMIEW7r/0aXQSjDhp/v7QeIL9nLT/NiNUi5puti/t9q/GDK+pj6UNQak56M2//iLQ0y+3ov9Fod/LJAAVnCgMAFFUX0AJ3nkRPT6Rz/dEtbKdmnVqUER6UzDvhcDfDV+OiMmSgVFZ43d9JkuDPTu5Zuk2J12kgxddjbbSf8Z5TqkaDPlz7OMCdEht6wyTt7QEX88sUaiFrRLgvGxm3BYv6FZ0FGWfKqEgqjnsFJkmIYPYl2jrAC20G9LE5T/niONA8V2wT6S7Ha0xXNWUk6xaWP64SVOFvRvG8mx9fstjLCMhRYGmpol5az6XSgZ9Xd+JzhkoAWc+xmYMrT30kw8LztcWEz1HeK+cktGYS7vB32fG+oM8MMz6bVtkouHiGVE+YlELr4GjUHrnWgNKqtrkL5btt8ceZqI9RjE9aUqN3KgJgAt8YselJLfqFHNu5kh0XQBbD8CIplN6nzaXTcK5qsboyNRAEC7kjzp0iG3vHqNSPvGlfqCKYCZNW9mPpFaTFPQoEhttDp9+W9cCSTeObdPTKe4n0a4CkLNsZ7mZlFHN+7BhJcPa5E/e8P14xJ0E5200RKjkv/+jXxMEvlay0xypHam6Bw15RJDW6vW2O1ZvBZUDtlrpxXf2YpfhFP55WGVbfiVcsQfQTzJkzmgBleS0lmuO7k3s/11XcCfpFSe2aLGA52ClXXvFzSeKFnrZ6gsa4vfX/8bnLQwZDB2btftzgoHvKRTQ9tw/fdicNck/qJDplSW192y/66bqpm/qKFqt8nrx1FfivIXZnqR+YpcvJuZWkp+uT06Jy5oDOHqjmKrQkQoWmQlXyzTHJSIYjK0pfwAV3X09uMYI7+tsR98K6yXNUmYYR7CC7n5m44eu0Gr3fBienuuXFTdbrQvaVHQsY+ekPWByR+rfhVKxoK7cYOJM14faQlpMfrrOtPSJ7yABcCyFRmcaluNQxUIx/ueC07TpbP1oIVhRrBpFPfmUuh8EhWsMqJOrZXvJ12pPrNvSWaqZ7sgs06NNob5iM0YsNPDMYtk7he0ZxwD2Pjh/u7w7X1CyGRJ8iFEn3xihuJzCkn9UU5toSt2jYA98IW32VopPuhqqpBk6sv+Rfs0HvSltGSF1QpbmAEAOrpv/jHlIrT9KhEXXVnQn5uYIMM447o0VAODIDP0UxGmUkRBCZs9YD/aMSaaqjhFjkIXCRIx44G1hMiyJMY1hXV1AVpQQPc61qQqltlXCJShzeDU+eIqeOXKLKEvHpSbSdyC0m7BSjet/2s6Mdwp/JuIft4oUCMF/DoGYGxEo6mi3OYUM+xBpep7iFAY1pb/DzdqHUn9NxwPi6C0OMxU+jaw2733LILmAcE0jFSJyQ4KpeCGubNWjMMg1iVPWtohYbRUuL8Hypq0d9QD2iJ2a6OLnU33HnolnO7VQKSIrBKMMeJZlPfptnytn3CW78xswDIGTsSLYFcbsNL2dj4f0ZU3nUhPy0XKqfEB3DgDpiwH1tdWrpWEaHgIEZWs7HIwSDb69K2kCDTnVGnb6hXSL/k4NvW2qHyTeMPYyqSbK4xwDX37UJMZbA4p62j4mDYa06tADbLsjr0PcLs1hkwanvZEcFz7fo/5Mf6n79QlBsjRyy6GdHwbUF8REbpQUY2j/lF38bz9cz2qwm0OpmpkX8eu4DGxsMZ05ycUk4WdZZv5zCpOV2oiDAvTnxQQY/j3A1wxjklolnjWWLRELaXae1z1KcHzlT+kro0eUIoqSHIbbnhysYb3TYLtllIFR5d7BzJxEirjoyogpnkNBnEXfxzqu1RjvNB1NM4fLOnnd0RmIjW6o7ncj0VY+wWsVVpIiybGvd7eFPftTii+zHU/eOfLOiVLEWwAcN8qQL4GpWC3fKNXBO7cW88YxMhE2SA+aef4WLYlg0y3S/tdoo4V03iSqgbvUwrI6sfcT8biJD8XG95/7MxD8iLzI1Lmj1lg0crieRctFoHel8fnZfOZyN3PkIlQUQGe4q5YG2nMWShtbJUqUs9QF4MuvNB1Xqel9mqzXzfkYArZ33+W6gBn8uMRTiH/uNsdAts3i5CCiScNs6CGXmD/IkX0G17EuHiHi31W2xHq921SRy6VLSM7MuiUmP8HWisDV9Qih8QYA+QI6nKbFtISIDgdLKR4nIjbXbW7FXcr6lu3ujvrAsK+o+O3rWEPhzFwzFRFk/VdwP2BJ+dthGHsj4XxxiZOFYGP3TahTy861IL3ZPbKPLFT5YVx5R+b6z+zaAdEXbE97xP74BJPfTaXR2X3k/rczKgt3GAdwYTHaJ4PMoiJyQ12J5nztQRo7rZdZBMmMqSJcZH1oyPGDCgBJ3nzXbS5F9FLqIbjaA6Sih5PQ6e63j3OucsXZmYU9nA6qQ7fG+x496RsvmvxND0CX+8ryZTbhXDuQoMBPEtY7wXQZegWQRkkrBmnErKEnmxDokiMuyh51z3dJOSYIyHYOfYFR5DAOE+ikEB/IWVva2WuOv+R670WwBRP5e4TqcGgZBk4ppa3YI8/jEqgVP8urL6JBdT0GGwcMwPPxdbvwFPUA8NQq77D01w79w5gJiv2ZXt74iZS7i5TS6yLvw0G/CSP/PaJ291m1Jh4/qSNpBoTEFOrUBhuTAzrn0MsAuuvnPwOnynwh850gqhXmtDml+6JwE84aHwSx5D34jKCUZ+TAtddczIQyxMg1qu7g7WhZe+WCvrzYgW8ZLR6dk7lS3/vXP7mMU6X46xKEb5YmakuT/FTW3xASywnE5+NMAtOWTxLEY60/NiqCVeqI8BPL+9Et5Lyw6di1DlF9Aa4VCqaOGLo6e6/9NlnI/QnFy0kEVxQmOVsRgf9k9P9VAHXMWy4vM05O6LQ/EAptQgFEkRvG4ZKQVcPPM68jSWMqoDdTqwPvELiVAT8K5ZC/OAVqOBqNbMKCzCK92quPV8iiBUnj+07IR44v65BjTWJOUR3f4tm5h4OvRdf2I6rW0RErwXeVLwI58ADfNh1ZyqMua8E4MTB3p7776us8lzYYSmdWCE9GZqY/vQUb6D5F0jO/W5U8ux0Pxqa3ORckrp99RN2vAqviwqMM67CNyyIJqO25kxpVxm4pvCf0h3KX6mzblooM4VFZEMpBREU5FaXTvNDIP00oFCwB+zpENLXLxfaNAuVemH7lbPiA==', + version: '0.2', + creationDate: 'Wed Mar 14 16:06:54 PDT 2007', + updateDate: 'Tue Apr 17 19:23:41 PDT 2007', + accessDate: 'Mon Jan 19 16:10:23 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 17:27:40 PDT 2007', + accessDate: 'Wed Mar 14 19:00:21 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:09:07 PDT 2007', + accessDate: 'Wed Mar 14 16:39:40 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 19:01:05 PDT 2007', + accessDate: 'Tue Apr 17 19:20:33 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 17:17:20 PDT 2007', + accessDate: 'Wed Mar 14 17:22:06 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:06:54 PDT 2007', + accessDate: 'Wed Mar 14 16:06:54 PDT 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 PDT 2007', + updateDate: 'Tue Apr 17 19:23:41 PDT 2007', + accessDate: 'Mon Jan 19 16:10:23 PDT 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 PDT 2007', + updateDate: 'Tue Apr 17 19:22:08 PDT 2007', + accessDate: 'Tue Apr 17 19:22:08 PDT 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 PDT 2007', + updateDate: 'Mon Jul 09 15:10:15 PDT 2007', + accessDate: 'Mon Jan 19 16:09:28 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:51:02 PDT 2007', + accessDate: 'Wed Mar 14 16:51:02 PDT 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 PDT 2007', + updateDate: 'Mon Jul 09 15:10:15 PDT 2007', + accessDate: 'Mon Jan 19 16:09:28 PDT 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 PDT 2007', + updateDate: 'Wed Mar 21 12:56:43 PDT 2007', + accessDate: 'Wed Apr 25 09:59:58 PDT 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 PDT 2007', + updateDate: 'Sat May 19 11:26:44 PDT 2007', + accessDate: 'Mon Jul 09 15:08:39 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:38:54 PDT 2007', + accessDate: 'Wed Mar 14 16:38:54 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:36:20 PDT 2007', + accessDate: 'Wed Mar 14 16:38:12 PDT 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 PDT 2007', + updateDate: 'Wed Apr 25 10:04:29 PDT 2007', + accessDate: 'Sat May 19 11:22:01 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:52:12 PDT 2007', + accessDate: 'Wed Mar 21 12:16:29 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:47:01 PDT 2007', + accessDate: 'Mon Jan 19 16:10:06 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:45:40 PDT 2007', + accessDate: 'Wed Mar 14 16:45:40 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 16:47:01 PDT 2007', + accessDate: 'Mon Jan 19 16:10:06 PDT 2009' + }, + 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': { + header: '####', + data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=', + version: '0.2', + creationDate: 'Wed Mar 14 16:20:58 PDT 2007', + updateDate: 'Wed Mar 14 16:20:58 PDT 2007', + accessDate: 'Wed Mar 14 16:43:46 PDT 2007' + } + } + }, + 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': { + data: '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', + version: '0.2', + creationDate: 'Wed Mar 14 13:35:58 PDT 2007', + updateDate: 'Thu May 10 15:01:21 PDT 2007', + accessDate: 'Mon Jan 19 16:09:54 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 13:35:58 PDT 2007', + accessDate: 'Wed Mar 14 13:35:58 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 19:24:49 PDT 2007', + accessDate: 'Wed Mar 14 19:24:49 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 17:41:15 PDT 2007', + accessDate: 'Wed Mar 14 17:41:15 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 19:25:28 PDT 2007', + accessDate: 'Thu May 10 15:00:47 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 14:46:36 PDT 2007', + accessDate: 'Wed Mar 14 17:40:01 PDT 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 PDT 2007', + updateDate: 'Thu May 10 15:01:21 PDT 2007', + accessDate: 'Mon Jan 19 16:09:54 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 17:43:29 PDT 2007', + accessDate: 'Wed Mar 14 19:23:51 PDT 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 PDT 2007', + updateDate: 'Wed Feb 13 15:29:04 PDT 2008', + accessDate: 'Mon Jan 19 16:09:41 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 17:39:39 PDT 2007', + accessDate: 'Tue Apr 17 19:09:44 PDT 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 PDT 2007', + updateDate: 'Tue Apr 17 19:12:39 PDT 2007', + accessDate: 'Wed Feb 13 15:27:04 PDT 2008' + }, + '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': { + header: '####', + data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=', + version: '0.3', + creationDate: 'Wed Feb 13 15:29:04 PDT 2008', + updateDate: 'Wed Feb 13 15:29:04 PDT 2008', + accessDate: 'Mon Jan 19 16:09:41 PDT 2009' + }, + '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': { + header: '####', + data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=', + version: '0.3', + creationDate: 'Wed Feb 13 15:28:28 PDT 2008', + updateDate: 'Wed Feb 13 15:28:28 PDT 2008', + accessDate: 'Wed Feb 13 15:28:28 PDT 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 PDT 2007', + updateDate: 'Tue Apr 17 19:11:33 PDT 2007', + accessDate: 'Tue Apr 17 19:11:33 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 18:43:29 PDT 2007', + accessDate: 'Mon Jan 19 16:09:30 PDT 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 PDT 2007', + updateDate: 'Wed Mar 14 18:43:29 PDT 2007', + accessDate: 'Mon Jan 19 16:09:30 PDT 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 PDT 2009', + updateDate: 'Tue May 05 18:48:59 PDT 2009', + accessDate: 'Tue May 05 18:48:59 PDT 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 PDT 2009', + updateDate: 'Tue May 05 18:47:53 PDT 2009', + accessDate: 'Tue May 05 18:47:53 PDT 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 PDT 2009', + updateDate: 'Tue May 05 18:48:11 PDT 2009', + accessDate: 'Tue May 05 18:48:11 PDT 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 PDT 2009', + updateDate: 'Tue May 05 18:48:59 PDT 2009', + accessDate: 'Tue May 05 18:48:59 PDT 2009' + } + } + } + } + } + } + }, + + //------------------------------------------------------------------------- + 'syntaxFix': "" +} diff --git a/frontend/gamma/tests/tests/Components/GridLayout/index.html b/frontend/gamma/tests/tests/Components/GridLayout/index.html new file mode 100644 index 0000000..0208a82 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/GridLayout/index.html @@ -0,0 +1,135 @@ + + + + + Card Dialog EDITING - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/frontend/gamma/tests/tests/Components/GridLayout/test.css b/frontend/gamma/tests/tests/Components/GridLayout/test.css new file mode 100644 index 0000000..21abd07 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/GridLayout/test.css @@ -0,0 +1,43 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +ul.testTabs { + list-style-type: none; + padding: 0px; + padding-bottom: 30px; +} + +ul.testTabs li { + display: inline-table; + padding: 0px 10px; +} + +ul.testPanels { + list-style-type: none; + padding: 0px; +} \ No newline at end of file diff --git a/frontend/gamma/tests/tests/Components/ProgressBar/index.html b/frontend/gamma/tests/tests/Components/ProgressBar/index.html new file mode 100644 index 0000000..d72aae0 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/ProgressBar/index.html @@ -0,0 +1,120 @@ + + + + + ProgressBar - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>
+

+

+

+

+

+
+

+

+

+

+

+
+ + diff --git a/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js b/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js new file mode 100644 index 0000000..822081a --- /dev/null +++ b/frontend/gamma/tests/tests/Components/ProgressBar/progressBar_test.js @@ -0,0 +1,125 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.ProgressBar'); + +Clipperz.PM.Strings.Languages.initSetup(); + +Clipperz.Tests.ProgressBar.Tester = function(args) { + args = args || {}; + + Clipperz.Tests.ProgressBar.Tester.superclass.constructor.call(this, args); + + return this; +}; + +Clipperz.Base.extend(Clipperz.Tests.ProgressBar.Tester, Object, { + + 'toString': function() { + return "Clipperz.Tests.ProgressBar.Tester"; + }, + + //------------------------------------------------------------------------- + + 'run': function () { + var progressBar; +/* +

+

+

+

+

+

+

+

+

+

+*/ + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_5')}); + progressBar.updateProgressHandler('5'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_10')}); + progressBar.updateProgressHandler('10'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_15')}); + progressBar.updateProgressHandler('15'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_20')}); + progressBar.updateProgressHandler('20'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_50')}); + progressBar.updateProgressHandler('50'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_80')}); + progressBar.updateProgressHandler('80'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_85')}); + progressBar.updateProgressHandler('85'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_90')}); + progressBar.updateProgressHandler('90'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_95')}); + progressBar.updateProgressHandler('95'); + + progressBar = new Clipperz.PM.UI.Common.Components.ProgressBar({'element':MochiKit.DOM.getElement('progressBar_100')}); + progressBar.updateProgressHandler('100'); + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + + + + + + + + + + + + + + + + + + + +init = function () { + var tester; + + tester = new Clipperz.Tests.ProgressBar.Tester(); + tester.run(); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html new file mode 100644 index 0000000..ac1585f --- /dev/null +++ b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/index.html @@ -0,0 +1,115 @@ + + + + + Simple Message Panel - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js new file mode 100644 index 0000000..85128d6 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/SimpleMessagePanel/simpleMessagePanel_test.js @@ -0,0 +1,95 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel'); + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Clipperz.PM.Strings.Languages.initSetup(); + +Clipperz.Tests.SimpleMessagePanel.Tester = function(args) { + args = args || {}; + + Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args); +// this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:function () { return 'test';}}); + + return this; +}; + +Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, { + + 'toString': function() { + return "Clipperz.Tests.SimpleMessagePanel.Tester"; + }, + + //------------------------------------------------------------------------- +/* + 'user': function () { + return this._user; + }, +*/ + //------------------------------------------------------------------------- + + 'run': function () { + var deferredResult; + var confirmationDialog; + + confirmationDialog = new Clipperz.PM.UI.Common.Components.SimpleMessagePanel({ + title: "Alert", + text: "Should lost pending changes? But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness", + type: 'ALERT', + buttons: [ + {text:"Cancel", result:'CANCEL', isDefault:true}, + {text:"Ok", result:'OK'} + ] + }); + + deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false}); + deferredResult.addMethod(confirmationDialog, 'deferredShow', { + 'openFromElement': null, + 'onOkCloseToElement': null, // this.getElement('cancelButton'), + 'onCancelCloseToElement': null + }); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + + +init = function () { + var tester; + + tester = new Clipperz.Tests.SimpleMessagePanel.Tester(); + tester.run(); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/Tooltips/index.html b/frontend/gamma/tests/tests/Components/Tooltips/index.html new file mode 100644 index 0000000..471eca9 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/Tooltips/index.html @@ -0,0 +1,143 @@ + + + + + TOOLTIPS - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
above
+
below
+
+
+
left
+
+
+ + + diff --git a/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js b/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js new file mode 100644 index 0000000..37c0e71 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/Tooltips/tooltips_test.js @@ -0,0 +1,117 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.Tooltips'); + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Clipperz.PM.Strings.Languages.initSetup(); + +Clipperz.Tests.Tooltips.Tester = function(args) { + args = args || {}; + + Clipperz.Tests.Tooltips.Tester.superclass.constructor.call(this, args); + + return this; +}; + +Clipperz.Base.extend(Clipperz.Tests.Tooltips.Tester, Object, { + + 'toString': function() { + return "Clipperz.Tests.Tooltips.Tester"; + }, + + //------------------------------------------------------------------------- + + 'run': function () { + var tooltip; + +//Clipperz.log("================== ABOVE =================="); + tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ + 'element': MochiKit.DOM.getElement('ABOVE'), + 'text': "Tooltip displayed above the element", + 'position': 'ABOVE' + }); + tooltip.show(); + +//Clipperz.log("================== BELOW =================="); + tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ + 'element': MochiKit.DOM.getElement('BELOW'), + 'text': "Tooltip displayed below the element", + 'position': 'BELOW' + }); + tooltip.show(); + +//Clipperz.log("================== LEFT =================="); + tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ + 'element': MochiKit.DOM.getElement('LEFT'), + 'text': "Tooltip displayed to the left of the element", + 'position': 'LEFT' + }); + tooltip.show(); + +//Clipperz.log("================== RIGHT =================="); + tooltip = new Clipperz.PM.UI.Common.Components.Tooltip({ + 'element': MochiKit.DOM.getElement('RIGHT'), + 'text': "Tooltip displayed to the right the element", + 'position': 'RIGHT' + }); + tooltip.show(); + + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + + + + + + + + + + + + + + + + + + + +init = function () { + var tester; + + tester = new Clipperz.Tests.Tooltips.Tester(); + tester.run(); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js b/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js new file mode 100644 index 0000000..dac8b45 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/UnlockPassword/User.data.js @@ -0,0 +1,977 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +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":"jufmL1KVY0YBl8MSaL413hGtw12I/+sFnumcfeVku9RRMBmXaXCfE/vYnraxZyPxJxVS3qFRWDKsSGR3pScdACSwlBD+mzjifRn2SCfXWutD1/oJiqiMvq3YFzwyZJiXx+oS5u8DOTieQT9HZYt0pUmAod9QHiq2NAkueVjvRkZI1saRlWGtNXCaJIHwpuFJpHBDSD//6D9DYeTdVUeFEbej+4oNYpBCkyE1G2OL6q50YRBYp9yARRiy9juKHRWFvZiSeMGEJQS0f2gaP+xZkb9Z4qrfDgAZ1F7oDbPksr2SOYlSsm0bqa6c+7Wtopdo63Urf7Ze3Wg9n8TGBk6H88boseR8e3sHudlmtO1oLxcB9p3z/NTceF6SvWyJWTxHeMe6O72dZVmSnZlXhD/IJamRt13HLk3g05d8oXfrXM3iMhIGQ+EsXMxZfKdXlZpyYtjWD5tcQTKz7M5Qo3SFmdkwDu4jH5ke+bD8CeluDcMaHF6KHfdV8nEsmsjGwrH6lqSCT/9kBO5ETqUJKloOhJpFpNS/EN7nxjXF/QbqnUmWV4wngdyYmk9goNZNfZv7C2ouiyys55/QEfGsIsvEPPSfO670oJuncTyfFngFj2tdh2JpJ5vytuoRNLOm7XPM3hDCvZCOpUnjbm+jt4AvdOGU7ID8a2mtZFjb2noP5emAxTg6MO6f3+44eTkUcbCDskO5fe6jd0pTdODk21Ilp7WUjFwxEdJG8tRrGYpLooProJExamL7WShm/S/nhJL4+euW+1UIDjcZJA+a7aGdMSC63qBvrEsNyf57SDBk/o2eNJHs2sndCzgvK42IKGKcipq9D1Gyos9JQsA3My9ARMt68V/5FfzOkgPO6mblOsQMoTyQj/OCLzITEBfqA5IufhljSEkD3CLkfkeVwVf1NB2SsTPXJFChnynfsK7cMFy0O2XBNByCRTQDqBDBYo673tI1KTGnT4gLSAwCt96lq8UkEdt51jjkAJcvBXkbswuw3hvhtzLJ302hkN9CIHJrEN0oss5mWlxIxYrCyqE3ABME3FCR9r+V7exuIaQn6mdJTkMcRbYmVQQkexsROh2cdx8I/tuMN4ECWEAL948k9vEPZfgaQirWnrTtHoxLzNAUBDSQfzYXd8yr0T4vAHLnXaUalWPgLamJJ3eR+LDFcDQVvFkaomsF3RpOIS5fswTBFuRKGKEBSIINc9AyC4DtkSmDMTF2S0TgpnGdK94ZS8C/PM8WEsX738echa5qZG5qG0f+koOUUrbaORcDqaktCuDmsgFTYiUv1JxFskTvS/t/EM2Y0MEKVLZBsoG+4WXz4XEE0VJFoI9glaYll96WH/iMbaVXRnDwjyE62CAk/8DXIf//MJQVyO6ElFsvCrDfH03yLpCJhqwHv+mD5sRctVaq6Cp5Ts3bzdFeiLCX9rhSaqdG5AuMk4dCInlywxrsOvBfNaDBjX7NGCULri6px2T53FNiH6ineVjr9TfgY2uoMyevLiQsGd3GHS4wnxiUfIyz7/Yav5an4o82cHhMVOLvfKwF8C2dJQDg9woJ3ju1ha66UA2XGScJVd93w3OWco78+giXBE96R3CebxgaWQ5Zif6nI+FJnw6OipaRgd7EyrLrQTWadvTiYLfDknlsxFZd4XVs33/3xxF3RyoVsIFO7cpEX/BLVB69v+1TJvLdiyGwSl5FUKbrcrXycZ67uTKtHyAI/vrzwwoQxYV8e32xW86blEjH4pq/Zrijm1wGw7IrD9fYVgEO7nnWpE/ac85LrDaJpGOdZ+slcVWM6THHR9boKJGLtuc8V81gDVNtZ/f4Hx5YXZWKIIfpe57BybWejdQ8ZACWK+mXOGczyXJ88B4nIvaKnRlhSszQryAZzSqJry2k3t1v73BzL48TZWJ6yu1rFmqAUk2V5DCA4XnyHfPuiG8hZfTuu1YXQ+iBgbyDipTwozQqyTv3SxLBPTFxKZLuabMn7ZTo/kLXGfVO/2va58bv6kzW6WjwZ0D481N1Nyd1kZUw1lyxXklcAzZqaHUiIsy+/5DgV/qULYFqEBMNMA7QvBfRN4VZRlnNiemgzkBQXj+JGJOWZMz5cvss291rj1fAe91s10nkZoaddDrvfgfjTq6n9XLSyGSmnrIDMLVc9+YuDtuaQ4gwuiLG2X57Jzrc/Xy7jdZ82G1j+cfT/8Pvb40i1K9aid0Z3xl/tm7jBAqQ91Ehkbo6c8jUVPaQsRcfTumtsNf+Xa5PJmQtEGEPCUlGN6F7eFB5eOLXQFdsLRL1x+SzhS7k3aDri9sTMwYQij26AexwwzAPqcOOkkfbYf0lov5Gxx0LhsZAetDZCRFlxjDRDS8jE8dKBBXkWFazF8K2rdQXKNlclwezCEDBwUWhoJs/H5ndJ38MpSPfKo1YsVvlxi4QFyOTDPJIstCCvYnCjj1r7SrkRrbcuevITRTxD4FKgPCdsYFlGfhS1zWb23DWYWo6fPQ1/zlnN01gZStxsZKepB3NnxbTSjBgTSmzG6RzZajv6BtqivtvOa1hI2KZQtVGCDU2+NGmfbJ5TTJehYiTEPeBF9TfLRP9rktQTUngj2ohv+1TDL0jL3YWiSA9TJzYonsincEVy1aRUeGVazWF2Rrq2o4hCBp12BfuMGHOdVkg9rMXdusyl2y75YyEkcBNMz4zi8i1lVhjUg16rCR48uKJ9QO2KBbjoGTx13uxIXTR8ufXx6mW7iW3qVx+6k7BQGKlMo1G64O8HQ2UrboS/tCqlP0W+7XB2C3EaZMqfKeYcuzM4MLkM6CT2GKYmJPyevXLKE749BM8zRQUcrWieAxmyD+g0QQ4T1fl0RTNEFB1/0BIg3fQQHCLGUTahXwt0EluG9iNPVgmFwwBHybH6gmIEZ4xnD8I7QPwgYY3JF407NdLkHjOuXrP+GODGEvX49MMaUigUUO2fkdw9EJbaidhx6j1EsFpQrz4Lt/5sAu5c9B/365TXtnNnmaPkaFj1q+3ezVXUroimRqxZ9BMaTm7J1hjubO+Dxjb2QlR/UApvQ0ty8aZpmIrMi0xjfoodIMiH6IYdw3VRZSqup7irWWpnJhef2qqtcpoxdiYZaFyf5u2XpZqEnAJpTupqOg+qJN/7aQt6ZmP7POFPwUwzwAsfTYk2EwMlTVAXrawZZEYu2JZ4kIjazo1LgyuuWTieEuONnye8Hr9p70RjwWUdlErlPSCKKn6JRdsM2no13F3151cfgx8I02J9vDuiNa3vfJfmRnBOly5jq6Wlnm2rJN6YYQHwbikoq3lJvkX5ZANDRKFlMWKK42+fXLBuofAZShFt6xvlY384aYsv3EcR42GOLrgYPQy0a7lr/FS4mM2ErNwNYnCz/xTuPBjgXXplbAnyA3jpKdPN1EfUM1oA4kZjECmkXZOuyEQxrndS9eOGbPM6S131zpdWEw9dWSZdkSI34+OkLfAKf6W6z4G4Z+cMRrkYLHs+BavJOum4XTjyyXHIKhQiqz9mgEf+ulodXi+LNsbq1eCcGPWrGg+GNwN1SjJHZm78gidyrlEF6xuPCaZRvGQtk59nuJULOZWkC3Ns/EcFiAql8cu37Lp842fsHHeCVOq0e8ZII4TPg9HKPwDD4HLSg4frBzyeZwK0nN30C5ATCxWdL4Q60cKtZyIEM7Kn1a/vifsAbe019Ui3ovTOCYiTCAdOLaAL/NdpgWA/fDNOsTlPvnEYkq+4+bV3Wyye9ddxICD4TnC2yvXvjw4C/WnYYceJy5R4KamIJueEGIHGp22/0DSF3H4ji3QoUDiFB/H+CA8A2q9LO9q0NYcf2P5q2MfdJGu4bd49g68mltj35pRnGQaafflXY9VmMfrlAbBYfUnsKOb3DOUpq8asveE41/6WkGcXFIuSABcbBf0cHIfBn41wRWQhoCm/JL8pfqEZC/paBdFBRW4FjKkxhbg4BPvBL0aQyGGkU8eH8tr8nm4YN1HMFF/s3s8+9FPoBxPuXLoGSg7Rvdz+g=="},"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: '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', + 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/gamma/tests/tests/Components/UnlockPassword/index.html b/frontend/gamma/tests/tests/Components/UnlockPassword/index.html new file mode 100644 index 0000000..5534068 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/UnlockPassword/index.html @@ -0,0 +1,117 @@ + + + + + UnlockPassword - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js b/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js new file mode 100644 index 0000000..87f3275 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/UnlockPassword/unlockPassword_test.js @@ -0,0 +1,136 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +Clipperz.Base.module('Clipperz.Tests.SimpleMessagePanel'); + +Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); +Clipperz.PM.Strings.Languages.initSetup(); + +Clipperz.Tests.SimpleMessagePanel.Tester = function(args) { + args = args || {}; + + Clipperz.Tests.SimpleMessagePanel.Tester.superclass.constructor.call(this, args); + + this._user = new Clipperz.PM.DataModel.User({username:'test', getPassphraseFunction:MochiKit.Base.method(this, 'getUserPassphrase')}); + this._unlockPasswordComponent = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ + 'title': "Unlock account", + 'text': "Insert the passprase to unlock the account", + 'type': 'INFO', + 'buttons': [ + {text:"Cancel", result:'CANCEL'}, + {text:"Unlock", result:'OK', isDefault:true} + ], + 'openFromElement': null, + 'onOkCloseToElement': null, // this.getElement('cancelButton'), + 'onCancelCloseToElement': null + }); + + return this; +}; + +Clipperz.Base.extend(Clipperz.Tests.SimpleMessagePanel.Tester, Object, { + + 'toString': function() { + return "Clipperz.Tests.SimpleMessagePanel.Tester"; + }, + + //------------------------------------------------------------------------- + + 'user': function () { + return this._user; + }, + + 'unlockPasswordComponent': function () { + return this._unlockPasswordComponent; + }, + + //------------------------------------------------------------------------- + + 'run': function () { + var deferredResult; + var proxy; + + proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false}); + + deferredResult = new Clipperz.Async.Deferred("unlockPassword_test.run", {trace:false}); + deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']); + deferredResult.addMethod(this.user(), 'login'); + deferredResult.addMethod(this.user(), 'getRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13'); +// deferredResult.addCallback(MochiKit.Base.bind(function (aRecord) { +// cardDialogController = new Clipperz.PM.UI.Web.Controllers.CardDialogController({record:aRecord, delegate:this}); +// cardDialogController.run(); +// }, this)); + deferredResult.callback(); + + return deferredResult; + }, + + //========================================================================= + + 'getUserPassphrase': function () { + return this.unlockPasswordComponent().getPassphrase(); +/* + var deferredResult; + var confirmationDialog; + + confirmationDialog = new Clipperz.PM.UI.Web.Components.UnlockPasswordComponent({ + title: "Unlock account", + text: "Insert the passprase to unlock the account", + type: 'INFO', + buttons: [ + {text:"Cancel", result:'CANCEL'}, + {text:"Unlock", result:'OK', isDefault:true} + ] + }); + + deferredResult = new Clipperz.Async.Deferred("CardDialogComponent.askConfirmationForLoosingPendingChanges", {trace:false}); + deferredResult.addMethod(confirmationDialog, 'deferredShow', { + 'openFromElement': null, + 'onOkCloseToElement': null, // this.getElement('cancelButton'), + 'onCancelCloseToElement': null + }); + deferredResult.callback(); + + return deferredResult; +*/ + }, + + //========================================================================= + __syntaxFix__: "syntax fix" +}); + + + +init = function () { + var tester; + + tester = new Clipperz.Tests.SimpleMessagePanel.Tester(); + tester.run(); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js new file mode 100644 index 0000000..cb80473 --- /dev/null +++ b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/CrossWindowsBookmarklet_test.js @@ -0,0 +1,66 @@ +/* + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Javascript Crypto Library. +Javascript Crypto Library provides web developers with an extensive +and efficient set of cryptographic functions. The library aims to +obtain maximum execution speed while preserving modularity and +reusability. +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Javascript Crypto Library 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. + +* Javascript Crypto Library is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Affero General Public License for more details. + +* You should have received a copy of the GNU Affero General Public + License along with Javascript Crypto Library. If not, see + . + +*/ + +newWindow = function (anEvent) { + var windowURL; + var htmlString; + var newWindow; + + anEvent.preventDefault(); + +// htmlString = 'TARGET WINDOW

this is the target window

'; +// windowURL = 'data:text/html;charset=utf-8;base64,' + (new Clipperz.ByteArray(htmlString)).toBase64String(); + +// newWindow = window.open(windowURL, 'CrossWindowsBookmarklet_TEST'); + newWindow = window.open('http://mail.google.com', 'CrossWindowsBookmarklet_TEST'); + MochiKit.Signal.connect(newWindow, 'onload', targetWindowDidLoad) + console.log("new window", newWindow); + + MochiKit.Async.callLater(2, runBookmarkletScript); +}; + +targetWindowDidLoad = function () { +//console.log(">>> targetWindowDidLoad") + runBookmarkletScript(null); +}; + +runBookmarkletScript = function (anEvent) { + if (anEvent != null) { + anEvent.preventDefault(); + } + + window.open('javascript:_cble=null;ilf=function(_1){var%20_2;var%20_3;var%20i,c;_3=0;_2=_1.elements;c=_2.length;for(i=0;i%3Cc;i++){if(_2[i].type==%22password%22){_3++;}}return(_3==1);};flf=function(_6,_7){var%20_8;var%20_9;var%20i,c;_8=null;try{_9=_6.getElementsByTagName(%22form%22);c=_9.length;for(i=0;(i%3Cc)&&(_8==null);i++){if(ilf(_9[i])){_8=_9[i];}}if((_8==null)&&(_7==0)){var%20_c;_c=_6.getElementsByTagName(%22iframe%22);c=_c.length;for(i=0;(i%3Cc)&&(_8==null);i++){_8=flf(_c[i].contentDocument,(_7+1));}}}catch(e){_cble=e;}return%20_8;};iev=function(_d){var%20_e;if((_d.tagName.toLowerCase()==%22input%22)&&(_d.getAttribute(%22name%22)!=null)){_e={};_e.type=_d.getAttribute(%22type%22)||%22text%22;_e.name=_d.getAttribute(%22name%22);_e.value=_d.value;if(_d.type.toLowerCase()==%22radio%22){_e.checked=_d.checked;}}else{if((_d.tagName.toLowerCase()==%22select%22)&&(_d.getAttribute(%22name%22)!=null)){var%20_f;var%20c,i;_e={};_e.type=%22select%22;_e.name=_d.getAttribute(%22name%22);_e.options=[];_f=_d.options;c=_f.length;for(i=0;i%3Cc;i++){var%20_12;_12={};_12.selected=_f[i].selected;_12.label=_f[i].label||_f[i].innerHTML;_12.value=_f[i].value;_e.options.push(_12);}}else{_e=null;}}return%20_e;};fp=function(_13){var%20_14;var%20i,c;var%20_17;if(_13==null){_14=null;}else{var%20_18;var%20_19;_14={};_18={};_17=_13.action;if(_17.constructor!=String){_17=_13.getAttribute(%22action%22);}if(%2f^https?%5c:%5c%2f%5c%2f.*%2f.test(_17)){_17=_17;}else{if(%2f^%5c%2f.*%2f.test(_17)){_17=window.location.protocol+%22%2f%22+%22%2f%22+window.location.hostname+_17;}else{_17=window.location.href.replace(%2f%5c%2f[^%5c%2f]*$%2f,%22%2f%22+_17);}}_14.attributes={};_14.attributes.action=_17;_14.attributes.method=_13.getAttribute(%22method%22);_14.inputs=[];c=_13.elements.length;for(i=0;i%3Cc;i++){var%20_1a;var%20_1b;_1a=_13.elements[i];_1b=iev(_1a);if(_1b!=null){if(_1b.type!=%22radio%22){_14.inputs.push(_1b);}else{var%20_1c;var%20_1d;_1c=_18[_1b.name];if(_1c==null){_1c={};_1c.name=_1b.name;_1c.type=%22radio%22;_1c.options=[];_18[_1b.name]=_1c;}_1d={};_1d.value=_1b.value;_1d.checked=_1b.checked;_1c.options.push(_1d);}}}for(_19%20in%20_18){if(typeof(_18[_19])!=%22function%22){_14.inputs.push(_18[_19]);}}}return%20_14;};pp=function(){var%20_1e;_1e={};_1e[%22title%22]=document.title;return%20_1e;};rs=function(o){return(%22%5c%22%22+o.replace(%2f([%22%5c%5c])%2fg,%22%5c%5c$1%22)+%22%5c%22%22).replace(%2f[%5cf]%2fg,%22%5c%5cf%22).replace(%2f[%5cb]%2fg,%22%5c%5cb%22).replace(%2f[%5cn]%2fg,%22%5c%5cn%22).replace(%2f[%5ct]%2fg,%22%5c%5ct%22).replace(%2f[%5cr]%2fg,%22%5c%5cr%22);};sj=function(o){var%20_21=typeof(o);if(_21==%22number%22||_21==%22boolean%22){return%20o+%22%22;}else{if(o===null){return%20%22null%22;}}if(_21==%22string%22){return%20rs(o);}var%20me=arguments.callee;if(_21!=%22function%22&&typeof(o.length)==%22number%22){var%20res=[];for(var%20i=0;i%3Co.length;i++){var%20val=me(o[i]);if(typeof(val)!=%22string%22){val=%22undefined%22;}res.push(val);}return%20%22[%22+res.join(%22,%5cn%22)+%22]%22;}if(_21==%22undefined%22){throw%20new%20TypeError(%22error%22);}res=[];for(var%20k%20in%20o){if(typeof(o[k])!=%22function%22){var%20_27;if(typeof(k)==%22number%22){_27=%22%5c%22%22+k+%22%5c%22%22;}else{if(typeof(k)==%22string%22){_27=rs(k);}else{continue;}}val=me(o[k]);if(typeof(val)!=%22string%22){continue;}res.push(_27+%22:%22+%22%20%22+val);}}return%20%22{%22+res.join(%22,%5cn%22)+%22}%22;};closeBookmarklet=function(){var%20_28;_28=document.getElementById(%22clipperz_bookmarklet%22);_28.parentNode.removeChild(_28);};lfp=function(_29,_2a){var%20_2b;var%20_2c;var%20_2d;var%20_2e;var%20_2f;var%20_30;var%20_31;var%20_32;_2c=%22http%3a%2f%2fwww.clipperz.com%2f%22;_2d=_2c+%22help%2fbookmarklet%22;_2e=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAAXCAYAAABOMABkAAAACXBIWXMAAAsTAAALEwEAmpwYAAANJ2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjardd5NJRv2AfwaxbGMmbGGHsY2Xcle%2fYtkWzZUpKdYSYmScqSlDVLKNoo2oQWEonqR5YkyZKtyJKlFLJkmfcPqd7feZfznvNefzzneu7nj%2ft+7nM+3%2fvcAHgNdxqNggSAwCB6sK2ZIdnJ2YWM6QQM4IAXsCDi7hFCM7C2toT%2fuhAA852AAABoV3Cn0SjwfytcsJOzCwBCHgBIPuu9PgCQDq739gBAOkKn0QEQvgBA8vB19wRARACAfLC9rREA4iYA4HzW+woAwB1c7xsAABfq4UMHQHQDMBODPP2CADBTAMy6nl4hHgA4eQDw9AzxCATApQKAVWAg1RMA9xEApD1owXQAPAsAKDg5u5DXl7w3AWAbPwCLxZ+xI5kAZXkA0rv+jIk9AuBxB8hP%2fjM2awsIAEDwtIZ4q2xd30GsIQDTAIMxKwmASQdYTWMwlvMZjNVrAKg+gFqKx+Hg0I39RrQA%2fG%2fv6%2f%2f8q1AIACQAQhxRiAxHRaAjmE4wR2FiWE6yGrPWsZ1mP4ON50jClRN8OdOIaVzppHPcmTyZvNl8dQJUwdxNuUKXhBvIh0XzN18Ta5U4Jlko1SZzQvaOXKdCjOJdpZ4tp7feV%2fmgmqRWrj6omaJVqT2qk6H7VG%2fCIMvwudFXkxzTerMZ8ys7myzmd+Vbvd79xvqNTZvtiv3tPR0OnY5dTt0u6L33XPv29e8fcPtw4ONBrMdjz2GvEe9RnzHfz37jAdyUZ4Ffgr5Sp2nfDn0PngmZo88d%2fhE6f2QhbPHoUvjPYysRK8dXI2WiOmIQJ5GxqFPoOKbTzGcw8SwJrIlsSezJ2BSOs7hUfBohnTODeI4rk5TFnc1znvcCXw5%2frsBFwUubLgtdEb4qkkfOF722+bpYgXihxA2pm1K3pG%2fL3JG9M1lEuStfrFCiVKp8b8v9LQ+2PtxWplquVj7%2fKLRC%2fbFGpVaV9pPt1duf6jxdq4ms1Xum%2f9zgheE%2fRnXouth6k5emDWaN5k3mzWzNia8sWixfW7XiWs++sW6zeWvbTmxPf2fXYd+5p4unK7vb8b1Tj0uvQG9un2u%2f68C+D8Ifrnx0GzwwJDqU%2f+ngsMeI56jEaOGY92efcd8JmYnbk%2f5TAV8oXxW+Fk8HfaN+p81smbk%2fGzwX8oM+rzpfvhC6GLZ09OfRZa3lqpVjqxFrOmtPGQwAhBgSh%2fyGakbfYcpgjsD4sNizGrFtY5fCSnHw4XjxfAQ+Tm6iJJc0SYPbkmc%2fbwhfCn+JQLPguBCXsJqID%2fm86EsxhLiOxCHJe1LTMtKyFLkqBZSigVKa8uBWGZW4bV1qsuo0jTotXu2w7a90efSo+s8NxY2OGbeZCpuF7ag2X7LYYum1K9OqzRpnY2YbZldg%2f86BzVHf6ZDzJZf6vdP7RPbvdgs%2fkO9ed3Dck9tLz9vJ54TvVb9a%2f%2f6ApUCuIDmqMc33UERwakg+vexwQ2jvkYmw+XDUMc4I8nH5E6qR+lEW0btj9p48EOt1ihJHPx18Jio+KuFkYnxSenJiSs7ZC6nZaWnpFzPSz2Vlns+6mX3jfPGFmzl3cksuPrn05HLdlVdX2%2fLa89uvtV%2fvLRguHLsxdHPk1vTt73emi77enSmeLpksnbo3dn%2fwwdDDnrK28sZHtRWPHpdUXqxKfxJVHfh0b41F7fZnss+Jz5defPynqe5hfcbL4Aa7RrUmwSZGc8+rhy0Jr11axVpH3zxoO%2f7WpB3X3v%2fuaod%2fp0rnaldLd8b7fT0yPbO9lX0x%2fRYDpIGBD7c+hgxqD6GHmj6dG94%2fIjUyNVo5Fv155zj3eP%2fE9UnKlOrU2pfGr+nTe7+Jf5v6%2fmAmYtZsjjjX%2faNgnrqguYhafLmU9nPvstjyl5Xy1ag1cwYPgwEAJxFhyHCUNqoSfZxJj6mGORpzisWUpY41ju00ewJ2J7aZIxmXjE8h7Ca0cqYS07kySBnc9tzveLJ4s%2fjO8+cI5Armbroo5CrUL3xF5Co5TzRvc57YNfHrEgWShVI3pG%2fK3JL1k52Quy1fpHBXsVipRLl0y72t91UebHuoWq5Wrl6uEaaxqFmpValdtf2JTrXuCd01vRr9WoNnhs+NXhjHmqBN6kzrzV7uaDBv3NlkkWiJtXy1q8Xq9e5W61Qbgk2b7Vu7dvt3ezodshx5HLucup3fu%2fTszXUVdO3b17%2f%2fg9vHAx%2fd8w6KHhzy+OQ57DXiXegjuZ4g%2fhMBdyjylKn%2flCKzv1Ok4qjG0aXwn8eWI1aOr55Yi2REQwzyd5JgzmDiWeIbE3Ymsidhk7EpHGfxqYQ0zt9ZwpPNe57vV5Zs+jtL8oeueVwXKxAvlLwhuZEmRfJ3FYoV%2f8oSlbJt5aqP1CvUH2tUalZpP9Gu3v5Ut0b3rxwxqTd9adpg1rijybzZ4lXo682tVm+s26zf2rQf75DtdOhy7I7pUep16YsbUPkQP6g6lDTsOao9ljbuN+n%2fhTJN%2fZ4w5zJ%2fdilx1ZbBAFg%2f+wAAmNUAsuQAHHIA7PIB4uQApNwAeG4CWHMA2GsCkkkYkDo0QOzU2Tg%2fAAEEEAJFMARnCIFUKIVFBBlhgQhD3ES8Rowh8UgzZDSyGrmC0kFFo+pRK2hRtDO6EP2DyZTpFFMJ0zSzGXMe8yiGG+OKqWbBsGiyxLJMsmqxUllr2RTYotgq2HHs0ezvsSRsEPYzhwnHSY5BnDvuOR6F98ZPEWwIWYRVznjOGaIWsYBLnauAa5rkRlrg9uMu55HjecnrzYfhu80vwX+Ef07gkqCZ4Oymq0LiQhHCCOEyEX+yKLlH9NzmzZujxPBireJpEnskBSSHpO5IG0nfkjGU5ZQdlHsgf1rBVVFFCas0pvzPlvytMSqe28xU5dW41FbURzWyNXGatVql2nnbz+mc0Y3UO6J%2fyIBi6Gfka+xrEmAaZEbfccw8dudZi1zLW7sqrBp391l%2ft8XYCdtr7LFzoDmmOBU7v3GZdeXbp7vf2y31QJX7Zw9eTzOvo95Ffnz+1gEJlLogJNWAFn3oRQgz3eJwepj4UWr4kwi24y4niiIZ0faxyFOucY%2fOcMUfSmhLzkxZSnVLq89QOpeTHXL+U45dbt3l4qsSeZeu8RYSbqTcwt0+eze7RKj0+n2FMuPytgr3x9+reZ8W1Rq+oNfh64sadjYntCi8bnsT2l7fQesS7G7ok+zv%2fpAwqDdcNOr5WWS854vDNM+3rpmcObeFqaWy5UgGH4MBAEhgA16QAT1wgsOQCRUwgMAglBFuiBREDWIWKYt0Q+Yg36HwqF2oJFQLmgO9G52J7mUiM%2fkxlTItMhsxn2V+j5HAHMa8YCGyeLJUsLKzurIWs6HZ9rM9ZGdj92CvwXJjadgWDlmOZI4pnCWuBM+Bp+I7CfqE65w4zlDOXqIp8R4XmSuda40UQvrC7c89wUPhmeGl887zhfMj+JMEBARuC2oK1m9y2DQuFCXML1wuYiMyQY4TlRRt2Bwkxiv2VNxDAivxTDJISkTqrXS8jKHMqmyVXIS8jvyCQo3iGSV7ZVHl6S01W9NU%2fLcZqwqrLqt1qD%2fWuKQZreWj7bhdR0dJV1SPqI82QBnMGH43mjaeNBk1nTWb3PFjJ9KCZMm7a4uV7u7d1rY2AbZH7XLt7+955dDruOJMclHaa+V6aN+F%2fXVuY+6sB5U9fD1zvGq8v%2fnK+Hn5Zwd0BAoG7aHm0j4HS4eE0htDhY6EhDWFix1LiZg44RzZEK0WUxBLPJVymngmK4EvMTdZNeV1qlfaz4zkTPWskfOXc%2fwv7rksc5Upb+ra84KyGxduxd3xuOtaYnpP48G2MsVHCo+lqySqpWuUn+m92FFn85LSeKg5reVq65O2gXZGp0i3To9nX+JA5cepT%2fwjhmNR4zcnh78KfPOeuTw3uiC9FLRcvoZgMACAGQggBIbgDKlQCm837G+4X1ePxqOd0T+YTJlyfnlfw7iyiLDEskyy2rPWsimwXWTHsUezL2CDsJ85PHHuuE94b%2fwUIYSwyhlP5CEWcKlzNZHcSAvcqb9NW%2fHP%2ffJsLYwQLvtl2WZd8i%2fHoTKGfxv+I%2fiX37eatVqlf+z+kfvfu%2f2f1PoM+vH5W%2f9bbWjPv93G3P5bbtLWP3KzmDfsXtLc0Hs9Y8NvEXFD8IOKDcNVJ9cVP+vZcNw43pzw6p+WrNdtb0LfCrXXd9A6S7viuht6Qvsk+wMGjD8kDOoNnf50cLhoZH60%2fbPIeMCE+aT0FOaLw9fC6bhvPt93zMjOss9+nXvz48F81oL9wtRi7JLhT6mfo8uRK3wrl1c5V2NXF9auMxIZDID1+xIAALAZUSnUYLKlkTH8%2f1Yg5fDGHEgAwHoF7bEDACIASPvRze0BgAQAWmAEVKAAFYKBDJZgBMa%2fnmTw+P3FD2D9LgcAwEwAuOgIAFCzeCzq3%2fPSvcLoAABGVNrRYD8fXzrZgEajeJGNqIG0w3SvYHmyeZCHojx5q7KyKgDAfwBYjP%2fgNJJdnQAAAARnQU1BAADY6%2fUcFKoAAAAgY0hSTQAAbZgAAHOOAADeVAAAgmQAAHjTAADDvAAAMucAABx04zkiNwAACnFJREFUeNrsnHts1FUWxz+%2f32%2fenemL0sLQ0kIfUh5ioQiCQGtFRNmCWElFWFwDEohgQNmwJVAx+pcEWERJLFZFDQ93eSgiAtsl8iyV1LYLpaWtpVBK2Q6lj5npvH6zf7QMjFOUxXUTy++bTGZy55x7z9w53zn3nHMzgtfr9aJAgYJuofo1yuXldaxZ8zEej0zv3qGsXbsQg0HL9u0F7NjxTwDS01NYsmSGstMK7j+CtLfbKSmpRpZloqN74%2fHIANTXN3Hy5FkkSSQmJkrZZQX3J0FEUUCrVSPLXtTqW1PFxvYhLe0hRFEiObm%2fsssK7k+C3AlZWRPIypqg7K6CnkmQ8vI6jhz5gZqaBjwemX79evHww4MYM2YIarX0i5NWV1+hqqoeALM5gmHDBgBQUlJNWVkNXi+MHp1MbGwUu3cfpbi4GpfLTXx8X6ZMGc3AgX395jt1qpyqqssApKWlEBxsYM+eo5SV1QKQmNiPp54aQ3R0RLf2uFweTp06y4kTZ6mvtxAcbGDo0DgefzyViIhgP9mqqnqf7QMHmklKiubs2Vr27j1Oc3M7K%2f+STWhHIdhugCB2vwFeGdRGiJkEolrxsp5CEJfLw7p1O9m27R+0t9vxeGQ8HhmNRkV+%2fn5GjnyAN998ibi47vMKQeh8%2fvLL46xduwNJkpg+fTwbN74CwOHDZ1i%2f%2fgtEUWT+%2fKnU1l7l0KHvAdBoVEiSyNat37J8eTZZWRN98+7efYzPPz+IWq1iyZIZFBaWc+LE2QC93Ny5TJqU6mdTXd01cnM%2f5tSpszidLlwuD5IkIkkieXn7eOONFxk%2f%2fkGf%2fJ49x9iw4W8AvPbaTMrLzeTmfkR7ux2tXseSRZMJPf4qNJyH238rhK4HgAcINcPsMtCGK17WUwjyzjvbyc%2ffT1CQjtBQI6mpgzAYdBQXV2CxtFFYeI6lSzexdWsOJpP+jpNqNGqCgw2AgF6vvW1chcmkJyhIz969x7Ba7aSlPURUVDjl5bVcvHiVjg4na9Z8TEREKGlpwwHQ6dSYTAaMRh2ffnoQh8PFpEmphIQYKSur5upVC62tNlas+ICIiFBSUhIAaGpqZdGi9Vy4cBmNRsWgQfEkJfWnoaGJ0tJqrl69ztKl7%2fHhh39m+PB4n+0mkx6tVsOZMxfYvr2gkxxaNSqpixHGEDAZQKXrSsYk8AKO64AIHhdIkuJdPYkgJSXV7NhRgNGoRxQF3n57HpMnjwKgtraR+fPfoa6ukaKi8+za9R1z507+VQvb7U4WL36WRYumAWCzOVi27H2OHy9Flr1s2fK1jyA3Icte3G6ZlSvnMGtWBgDXr7fxyisbKSurwmZz8dFHB0hJ6YxYmzfv9ZFjxoyJrF79RySp81i0adNuNm%2fei9XawaZNe8jLe81vLbVaorS0Go1GxUsvPcUjjwxGlr2E946EJ%2feBx9EZMgSh8xh1+EX48evOqOIGBk5TokcPgO8QfeDAaTo6nLhcbjIyUn3kAIiLi2LhwmlkZIwkM3OcX8XqXuB0uhk8OJZ58572jRkMWl599VkMBh1qtYqKiotUV1%2f5iZ6LUaMG+cgBEB5uYvHiZxBFEa1Www8%2fVHL9ehs2m4MjR4rRaFSEhZlYsOAPPnIAzJ07mZiYSFQqkeLiSl%2fecTsZvV6ZnJzZ5OS8QHp6ChkZIwgyGkAXAUH9IMgMhr5QtrmLHBI4PDDoGZiwQfGunhRBzp+%2fhEolIcteRo16IEBwxozxzJgx%2fn+yqMvlZtiwAWg0%2fkRLSOiH2RxBVdVlXC43dXWNxMebfe+73R5GjEgMmG%2fw4FgiI8O4dq2ZlhYrjY3NSJKAxdKKWq3C7fbw1lufBujZbB1IkoTV2kFFxSUSEvr55WOxsX2YMuXhn%2f8wJX+FE6tBJYLTA3ETYdJW%2fBMUBb9rgng8MnZ7B6IoIIoCvXoF%2f8bLejGZDAGjarVEUJDeR4bWVluATHBwUMBYUJAOrVbti052uwNBEHA4XBiNOhwOFwcPFvHTWzU6nRZRhI4OJ42NzX7veTweoqMj%2fXKoAFTthGPLOsnhliFqKEzeBiqj4lk9iSCSJKLRqJFlkGUZi6U1QLClxUp9fVNnjmrU079%2f5K9YVuDGDWu35Vir1d5pmErCYAh0zhs32gLGrNYOHA5XF8lUaLVq37PT6SYiIoS1axd2fUbZp6fValCpJJxON9HRvbstNtwRlwvg8J%2fg5nwhMTDli84jl4Ked8RKSDBTWHgOlUqiqKiCmTPT%2fATz8%2ffzwQf7AC+zZk1i1ao597yoWq2itLQam83hR4Iff2zgypUmJElCq5WIje3jb2yXbV6vF+FmTRmoqLiExdKCIAiYTHqiosLR6dT06hXMtWvN2O0OBgwwB5Sna2oasFhakSQxoB%2fys7CUwLfZ4LJ1lnZ14fD0bggdpHhUT03Sp04di0ajQq1WUVBwhq++OukTKiqqYPfuo77k%2fPa+wb1Ao1FRWXmJd9%2fdhdvt8VWj1q37AputA5fLTVJSf5KSov30tFoNxcWV5OV97Ru7csXChg1%2fx+Vy43A4efDBeCIigjEa9UycOByn001bm42NG3fR1mb36R05UsLs2W8xc+Yb5OTkIct3eanZWg%2f7n4P2f3cm5YIIo9+EsEFgvXLbox7cVsXDekoEGTEikdmznyAvbx8Gg47c3Hy2bStApRKpqKjDbndis3WQmfloQPn1XmA06snP38%2fRo6VERYVTW9vAtWvNiKIIyLz88tRu9QwGHevX7+SbbwoJDw%2fmwoVLNDe3IQgiBoOa+fNv6S1YkElhYTlVVfUcOnSasrJq+vePwmq1U1l5CbvdiU6nYdmy57o9znV%2ftPoOLBdAowZkECT4%2fm0oXP2TUl0bpL0Pg+cpXtYTCAKwfHk2JpOBzz47iMXSysmT%2f+JmjmI06snOzmDFiudvS2RlX8fdZgvyJcFOp4vWVhuSJGG3OwIWdTicTJ06DoNByyefHKC0tMbXEe%2fVK5jXX8%2fuloQOh5Pnn3+clhYbO3cW4PHI6PUaAMzmXqxcOcfXJASIigrjvfeWsmbNJ5w+fY6amltXYDQaFVFRYSxZ8ixTpoy+5ddOF21tdkRR9OVD%2fumTt7NT7nTd3AXoaAiUcwIuJYL0KIKIosCiRdPIzBzHsWOlXLzYCECfPuGkpj7AkCFxfsqJidFs3ry0qyKk8VV8MjPHkZwciyAImM2B96Pcbhm9Xs2qVXPIyBhBYeE57HYnMTGRpKen3PFOldvtISQkiJycF3jyyVTOnKnE6XQzcGBfHntsBJGRoQE6cXFRbNnyOkVFFZSWVtPU1IJGoyIxMZqxY4fSu3eIn%2fz06Y8ydOgABEEgMjIs0AjzeJi24873sHy%2fHk7oM1rxsJ5EkJuIjo4gO%2fuxX1QOCzMG3H0CiI83+%2fUvuvUfT2e0GTt2CGPHDrlrg29WodLTU0hPT7krHUkSGTMmmTFjkn9RNiGhn18%2fJPBsGAMJMYrn3G9JugIFCu4ygvxWcDrdWK0O3+v%2fTq%2fjv9ZToOB3RZAnnhhFTEwkoigwYMDdN9SysiYwcmQisuwlOTlW+dYU%2fN8gKP9qokDBnfGfAQA9nOAwz2UemwAAAABJRU5ErkJgggo=%22;_2f=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAGlCAYAAABAwstlAAANMWlDQ1BJQ0MgUHJvZmlsZQAAeJyV13k0lG0fB%2fDfLIxlzDDGHkb2XWQPWSJL9mwpMXbDTAyplCUpRJZQtKBoU5RIJKqHLAnJklBUZCmFSJZ5%2f5Dqfc553ue81x%2f3+d2%2f+9znuu77nM%2f3OhcAXsuTRqMgASA4hB5qb2ZEcnF1I2F6AAM44AMsiHqSw2iGtrZW8I9jvgcQAABdip40GiUc3ZFJftCtapBvLz7n36D0z+8BAAAu1MXVDQChAABEv7V6KwAQvdZqRwAg7qfT6AAIfwAgkv09vQEQUQCgEOpobwyAuAoAOL+1ugoAcF5rdRMA4CLIfnQARB8AMyHEOyAEADMFwKzv7RNGBsApAIC3dxg5GACXBgDWwcFUbwDcWwCQIdNC6QB4FgBQdHF1I60teVcSwGYBABbL3739WQAVBQAyO373xO8B8HoCFKb87s3aAwIAELztYb5qqgAAgMAaATANMRizUgCYDICVdAZjqZDBWLkEgBoAqKeQw0Mjfv4vBKIN4N%2fu177550AhAJAACAlEMfIgKgodxXSEOQYTx3KU1YS1ge04+wlsIsdJXCWnP1c6IZ07g3iaJ4s3iy+Hv0GQKpS3IU%2f4vEgTKVyscOMl8XbJQ1LF0p2yR+RuyPcoxindVO7fdFz1jtob9ZMalZrD2qk61bqjepn6Dw0mDLONHht%2f3pZr2mg2Y37RosVyfkeh9XObDtsOu077ZcfrO7udepx7Xfrc0Ltuuw%2fsHtwz5PFm71svLPm+93ufD76jfmP+HwPGg3goj4I%2fhXymTtO+7PsaOhM2R58L%2fxYxv38h8vuBxYM%2fDi1HLR9eiZaN6Y5DHEXGo46hE5iOM5%2fAJLIksSaznWRPwaZynMKl4dM5M7gyCae5s4jZPDm8Z%2fjO8ucK5AmeEzq%2f4YLwRZF80QJSodiljZfFiySKJa9IX5W+JnNd9obcjckSyk2FW4qlymUqtzfd2VSuendzhXqlRuX8vYgqzfta1To1ug+21G55qPdwtS663uDR1seGT4z+Mm5AN8Q3bntq2mTWbN5i3srWmvzMss3quXU7rv1Uh22n3Qv7LkJXxkuHbseenb28vTl9zq9c+t1eC77OG3AfdB%2fa%2fUbkzcW3HsN7R8RGCt95vSd%2f8B6VHC0e8%2f3oN+4%2fITtxfTJwKugT5bPi51vTIV+oX2kzm2buzIbOhX2jz6vPVy5EfI9cPPDjwJLOUs3yoZWoVb3VhwwGAEIciUN+QbWibzBlMkdh%2fFgcWY3ZNrNLY6U5+HF8eH5Ofi4eghS3DFGLx4p3D18Yf6pAqWCr0Lgwt4iGqB%2fpjNhTcYSEnuQ+qdvS07IychT5GkWUkqFyusqwqqxawuZeDTlNmlaDDp9u5JZn+rwG1K2PjSSMD5l0moqYRW6vNV+03GTlsyPLutMWZ2dmH+lQ5PjSic15q8s+1%2fNujbumd4vusfE4uLfQs8Fr3JvHx8DXxe+If35AfeBg0GIwd4g81YTmvy8qNC2skF4R3hTxev9E5PxB1CGuKNJhhSPq0VtjLGNt4nYd3Rvvc4ySQD8eeiImMSbpaHLiyYyU5NTcU2fTctLTM85lZpzOzjqTfTXnyplbZ6%2fm3sgrPffg%2fIMLDRef5XcWdBV2Xeq6%2fLroffHYlZGrH65NX%2f96Y7rk882ZW9Olk2VTt8fuDJeP3O2v6Kxsvldfde9+afW5mowHMbXBD3fVWdZveST3mPB48cnbv1oa7jZmPg1tcmjWaBFqYbT2P7vblvTcrV28fbSjvPPwi21duK7Bl%2fndgT1qPSu9bX2Zr3b3y%2fbPvq4eiBu0HCIODb259jZsWHcEPdLy7vT7PR+kP0yNVo%2fFfrQY5xkfnLg8SZlSn1r91Pw5Y3rXF4kvU1%2fLZ6JmzeYIc33fiuapC9rfUd+fLqb%2f2LUkvvRpuXIlZtWcwctgAMBRRCTyIEoXVY0+zGTAVMcciznGYsrSwJrAdpw9CWuBbeVIwaXgUzltONu50ggZ3JnETB5Hnpe82XzZ%2fGcEcgXzhPI2nBN2Fx4UuSiaTyoQK9hYIH5J4rJkkVSx9BWZq7LX5ALkJuSvK5Qo3lS6pVyqUrbptuodtfLNd9UrNSo1K7Uitb5rV+tU69ZseaBXq39Ef9Wgbmu94SOjx8ZPTOK3obc1mDaaPd3eZN5s0WKZbIW1erajzfq5Tbttmh2nXaf9C4cux5c7e5yynXmde136XF+59e%2fKcxdyH9g9uOeNx9u9bz0LvMS8RsjvvN%2f7fPAt9pNaS5DAiaAbFAXK1H+lyOyvFKk6oHVg8eCPQ0tRy4dXjqxGM2IhDvkrSTAnMIksic1JFsnsJ7Ep2FSOU%2fg0znSuX1nCm8N3hv9nlmz4M0sKRy6RL4sXSRRLXZFaT5MShZuKt5T+yBK1is2V6vc0qzTva1Vr1+g+0K3d8lC%2fTv+PHNnWaPrUtMmseXuLeavls4jnG9utO2w7bV%2fYdR3ulutx6nXui+tXfu02kDCk9iZxWH3k5HvvUd2x9PGAycBPlGnq16Q5t%2flTi8kr9gwGwNreBwDArAGQLQ%2fglAvgUAiQIA8g7QHAexXAlgPAURuQTCKA1KMBwkJvff8ABHCCMCiBEbhCGKRBGXxHkBCWiEjEVcRzxBgSjzRDxiJrkcsoPVQsqhG1jBZDu6KL0d+YTJmOMZUyTTObMRcwj2J4MO6YWhYMizZLPMskqw4rlbWeTZEthq2KHccey%2f4KS8SGYD9ybOM4yjGM88Q9xqPwvvgpTjvObM4VrkSuGYIOoYhbk7uIe5roQVzgCeCp5JXnfcrny4%2fhvy4gKbBfYE7wvJCZ0OyGfGEJ4SgRhEiFaCBJjNQvdnrjxo0x4njxdol0yZ1SglIj0jdkjGWuyRrJcckNy5crHFd0V1JTxiqPqfy1qVA1Ts17s5m6gga3xrLmqFaONk67XqdMt2DLab0T+tEG+7fuM6QYBRj7m%2fhvCzINMaNvP2Qeb3HKMs%2fq2o4q62abAduv9hgHEUetnQ5ONOdUl1uuHW6z7vy79ff4eqTtrfH8SObzNvM54FsSwB9oG5REaQhBUg1psfuehDHTLcMzIiUOUA8+iGI77HakJJoR6xiPPOaecO8Ed+K+pM6UrNTFNI%2f0xkzl07k5YWfe5TrkNVy4lS9ZcP4SXzHnldRruOunbuaUCpddvqNYYVLZWeV5%2f2st38OSeqMn9AZ8Y0mTRWtSm+Lzzo6IrsZuWq9QX9OA1GDfm6Rhg%2fclo94fRcf7PzlN837pncmd81iYWqxYimbwMxgAgAQ24ANZMAAXCIcsqIIhBAahgvBApCLqELNIOaQHMhf5EoVH7UCdRLWhOdA26Cz0ayYSUwBTGdN3ZmPmU8yvMJKYcMwTFgKLN0sVKzurO+stNjTbHra77GzsZPY6LA+Whm3jkONI4ZjCWeFK8Rx4Kr6HcyvnZS4cVwTXa4Ip4TY3iTuDe5UYRvzEE8gzwUvhneGj883zHxRACJwUFBS8LqQt1LjBacO4cIyIgEilqJ3oBClBTEqsaWOIOJ%2f4QwmyJFbykVSItKj0C5lEWSPZFbka+SgFPYUFxTqlE8qOKmIq05vqVNPVAjebqIuoL2l0a97XOq8dq+On67xFT09ZX8yAsBVtiDKcMfpqPG0yuW3UdNZscvs3C6Ql0YpvxyZrfRsbW3u7IPsDDnmOd3Y+c3rtvOxKdFPeZe2+b%2ffZPQ0eY56sXipkf+9cnzrfL%2f6yAT6BOUHdwUIhO6l5tI+hMmER9OYI4f1hkS0HxQ+lRk0ccY1uitWIK4onHEs9TjiRncSfnJeinvo8zSf9R2ZKlmb2hzMXcgPP7bwgm89UMHXpcVHFlbPXEm6Qb7qXmt7WKt9coXRP8b5MjWStTJ3KI4Mn2xvsnlKa97Wmt+W3P+gc6mL0iPbp9XsPJA9Vv516J%2fDBaCxm%2fOrk+8+CX3xnLsyNLsgshixVriIYDABgBk4QBiNwhTQogxfr9tfdr6lH49Gu6G9Mpky5P72vYtxZRFniWSZZHVnr2RTZzrHj2GPZF7Ah2I8c3jhP3Du8L36KM4xzhSuRwEso4tbkbiF6EBd40n6ZthaY++nZVgQhUvHTst2a5J+OI2SN%2fjT8W%2fBPvy+063XKftv9Lfef3f4vtX7DAfyBtn9XG9H%2fd7dx1%2f+Ue1L1t9xs5nW757XX9V7OXPdbQlgXXF61brjm6JriR%2f3rjpvHW5Oe%2fdWW%2fbyzI+KFcFdjN62nrDehr6k%2fYkBqMGjI5E3SsMHI8Xde70s+zI92fRQdD5own5SZwnxy+lw8nfDF7+v2GblZ9tnPcx3fyuezFxwXpr7HLxr9kP4xuhS9zL98YYVrJX5lYfUyI5nBAFg7LwEAAJsxlUINJVkZm%2fzL4e7%2fHcGU8PU5kACA9QnZ6QAABACQCaCbOwIAEQB0wBioQAEqhAIJrMAYTH5eSUD+9SQAYO0sBwDAzAlwzhkAoO77oZi%2fz0v3iaQDABhTaQdCA%2fz86SRDGo3iQzKmBtPC6T6hCiTzELKSAklVRUUdAOA%2f67wHk5DqTvYAAA7ISURBVHic7d1NjNz3Xcfx78w+2Y7tJo5rjEOVh6YoNaWAcqgSIiFURYVWEEJIT9wRF4SK4AZCQoJLIwWJCxcuHCo1TaJIqE3CgyrIg+K2qKVpm0DzUMWpHSdO4ti7ftjdGQ6zf+9%2f%2f95N7Zm1vZ%2fk9ZL+mp3Z2ZnxYd%2f6%2fn7z33EVAAAAAAAAAAAAAABsJb0P2fMCm2d4pZ%2fwSoSj+xy9DW7f6P7A1deN00bXL2vELlccuo%2fbX7mtHavu9cv5eoDJDda5Pqy1sepe31SbHYj247Uj1V%2fnst%2f6md4GjwFsDetFqTkGrWO9729auKY364HqwumpX1VTtRqnqc71dtDWm7aAq2%2fY+bq53o7Ucufr5noTs+7jjG2zgtVEph2n5uuZqpo6cOCOj+39yK2fn5nZ8dler39Tr9ff1+v1rtmk5weukOFwOD8cDo4NB4OfnFta+Pe33n3x8SNHDh2uUagWazVayzVqQzdeY9uMaaY9ITWxml45Zm644c4b9u05+Bcz03NfrOpNbcLzAVvKcHlx8czXjh7%2f%2fpePHDn0eo2itdQ6lmvt0nFskwarvYxrh2q6quYO3vrFz+%2fc+dG%2fr15v54TPA2xxw+Fw%2fuTJo1964aWHH6+qszUKV3O0l41jLw8nmXg2itVMVW3%2f9ME%2f%2fKPt26%2f%2fcq%2fXm5vgOYAQvV5vdnZ21xf2XPfx08feev75zrc3ZQ9rkgmrvQxsQjVTVdtu+%2fh9X9i1a%2f8%2f9nq9NY9%2f8y37655776zP3HFb7d+%2fp3bs0DJIs7Bwto4efbuee%2faFeuzRZ+qVl4+u+f5wWIMTJ177k%2f995bFvVNWZGk1bZ2t1edhMW5ds3GB196xmaxSruX37fu2mGw%2fc+a%2ftDfXp6an60z%2f7%2fbrv%2fruq3++v%2f4hAnMFgUA8%2f9FQ9+MAjtbS0fP724XA4%2f%2fJr3%2fzd48d%2f8GqNonWmqs7V6r7WWPtZ4y4Jm2A1pyrM1Cha2z9x02%2f%2f1fT07K82d5yenqoH%2f+GP6+7P3V6dgQsI1+v16pc+dWN9+lduricf%2f04NBsPm9tkd266%2f9o03v%2feftbpv1d58rxpjmThJsJpTF2aqaq6q5vbu%2feWb9u659e+qeufHqC%2f9+R%2fU3Z+7fcynARLccMPe2r17Rz3z9A%2fP3zY9PfuJhbMnvnHmzPH3au27hGOf4jDO+qx7GkOz2T67b89tv9U+deHmW%2fbXffffNc7rAsLcd%2f9ddfMt+1u39Kb2XX%2fw7qraXqvbRu1zNC95yTXJhlL77PWZqpqdm939G+073HPvnfas4EOi3+%2fXPffeuea27XPX%2fXqNVmCztTrcTNWFf5J3cc8x5mtb7x3CuX5%2f+hfad%2frMHbeN+fBAou7vfH9q5kBVbatRsGZr7YR1ycYNVvtPcM4vCfv9qb3tO+3fv2fMhwcSdX%2fnp3pT19dowmpOe2omrO4nuFyUcfewmssmXNNVNdPr9be37+g8K%2fhw6f7O9%2fpTzXTV7F+NHauqyZaE7T2sZsoC6Gomq+a4Ypvu3Y+D6XcOgK7uR0t1+3HRJt10735CA0BX+93Bsaerqsmmom4lncYOrGe9yeqKB6vqwkkLoGviUDUmnbAAfpaN3hG8ome6t1+ICQvYyHr%2fW9ZVWRIC%2fCybthoTLCDGJKc1AIzrii4Ju2tRAQPez0a9uGJ%2fSwhwsd6vGxfdFHtYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEECwghmABMQQLiCFYQAzBAmIIFhBDsIAYggXEmCRYw84BsJFN6cU4wRIo4FJ1mzF8n+9taNwJS7CAzXBJLbGHBcTYzGCZuoD1bFobNnXCGg6Wz7SvLyyc3cyHB7a47u%2f8YLB8trZQsAY1ejGDqhouD5beaX%2fz6NG3J3x4IEn3d355sHhi5cvmzbpBTfDG3STBGrReSFXVcHn53BvtOzz37AsTPDyQpvs7v7R05q26MFLdy4u2GUvCwcqxPL9w7L%2fb33js0WdqMBis%2f1PAB8pgMKjHHn1mzW2n5o8+X1XLreOKnofVPflr0D6OvvU%2fh4bD4flCvfLy0Xr4oafGfW1AkIcfeqpeefno+evD4XBw7Pj3v1udTrSOS47XJOdhtZ94qaqWTp16%2fY35hWNPt+%2f44AOP1LcOvTjm0wAJvnXoxXrwgUfW3HZq%2fsi35+ffOFYrfajVKasdrEsyNebr61fV9MrPz6wcs1U1d%2frsu0f2XveLv9nr9aerqgaDYT35+Hdq9+4d9cmDH6terzfmUwJbzWAwqK999b%2fqr%2f%2fyn2tpabl1+%2fLZH7%2f6xD8tLs6%2fXVWnqmqhqs5U1dmqOldVi7Uar4s2TrB6K0d%2f5ZiqUbxmq2rm3LmTg15v+p1dOw%2fc3utVb%2fTih%2fXM0z+s%2f%2fi379bi4nJds3Nbzc3N1szM9BhPD1xNCwtn67XX3qzHv%2f7t+tu%2f+Up9%2fV8O1WCwOiwNh8Ph60cOfeWdd%2f%2fvxaqabx1nVo52sC5pyhpn3OnV6mQ1W1XbqmpnVe2qqo9U1bVVteeWGz%2f7O9dfd9vv9YxU8KExHA6Hbx7%2fwROvvvbNJ6vqnap6d+XyRFW9V6NJ63SNJq1mmXjR0Rp3wqoaTVdNvJpjujneOfHK4RrU8Z07f%2f6TzfIQ+OAaDJbOHf7pcw8fPvLsszVaBp6q1emqvSRcrFGsmr2sizbuHlbV6rKwuZyq1YD1q6p%2fcv6nx989+ZPnt81du3N2dtfPmbbgg2c4HA7eO3n4+R+%2f+sRX3z3x0ks1CtXJ1uXCytGOVROsSzJuQJowNRPVtqrasXLsWjl2ty6v2b597%2f6P7jn4qd07D9w6PbP9uumpuWv6%2femZMZ8fuEoGg6XFpeWz84uLp0+cPHX45Tff%2ftGPTp8+%2fmaNlnpNqN5rHfMrtzVLwXO19rysizZJsLob7ttWjmtqtKe1s1ZitfL19pVjbuX+zbuMzZRW5dMjYCtqn5nenNK0XKNpabFGETpTq0u%2f9nTVLAtP1yhUzZQ11qkN4+4tNS+613rh7eVhr%2fWPa8a%2fsyvHbK0Ga7rzc1XjRxS4fAaty2Y6WqrR736zN7VQq9NU83V7qmqfyjDWeViTboZ3a9trHe1gnavRP+p0rR+s9pQlWLD1dKerQY1+55upqZmymv2qM63Lc7X6juBYoWpMEqzmxW%2f0vabCzT%2fqdI2WjLM1OiWiWU62gyVWsDW1%2fySv2TBvJqxmgmomrTO19iTRJljt0xjGitZmTVhVo9gsdm5vV3i2RtGaqbXTVfPuYjtW9rLg6lvv0xWaCamJTxOi9v5Uc9nEqrnfRB8tUzV5sKounLQWa+3oOFOre1hNrJrztjaarkxacPWtF5b23xA3IWoum32q9qkL7VhNtBys2pxgNdqbcu1gNWNjO1TN0d5sb09VggVbR3sqan7P25vn3T9ubp9n1XSgasJYVW1+GLonk645kbTWn6zaobIUhK2ne1pD1doYtb9u9qgm+hiZjVyOSaZ7TlW%2fLlz6rffOoKkKtrbup4a2V1ODdW6rWrtdNLHLGYn1YtTdrxIqyNKelNofk77esemuVCy6z7NRqMQLtq71%2fvfmsf4H53FttUBstdcD+D9HAQAAAAAAAAAAAAAAIN3%2fA%2fPNWgCA%2fF3MAAAAAElFTkSuQmCCCg==%22;_30=%22data:image%2fpng;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAIAAAC0D9CtAAAABGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGiSURBVHjaYvz%2f%2fz8DiYAFU+jhg5cXLtx9%2f+4LLy+nlpa8hpYsIyMjTj03rj%2fu71l74fxdZEEFRfG8wkBrG224CCPcbfv2XKivWfjr1x+s7snM8U1IcoOwmeA24NEABNOnbN698yyKHqCTIBrcPU2WrKiIjHYEsh2c9BctK0tMcYeomdC37sePXyAW0G0P7r8wM8yBoFs3n%2fwHgwP7L%2f79+xfI+Pnzl6VpHkR27+7zQBGQPcie3rr5JIRh76DHxASS3bHtzN8%2f%2fyCCF87fgbrt%2ffsvcD3Ll+4%2feOASnPvg%2fsuO1hVwLjACoHqA8QAXBfrB1k4HOaDjEl3hXF4+LqgeYMTBRZNS3CFOAtoAEUlIdGNmgQaVlrYcVA8wpoHmQUT377v469fvTRuOR4W1zZi25cf3X6DAAPuHi4vd1l4XEadHj1wtypsB0QY0Fe5pZHZOvn9svAsifoBJAxjTEDZcETLbw8s0Js4ZPe0AATCmgRH35vUn5BQAdFJSqgdQAzylMqLlBWBMHztyDRgPoHTNxwX0NNAP%2fPzcyGoYycg%2fAAEGABYVzxqE3YcJAAAAAElFTkSuQmCCCg==%22;_2b=document.createElement(%22div%22);_2b.setAttribute(%22id%22,%22clipperz_bookmarklet%22);_32=%22%22;_32+=%22%3Cstyle%3Ediv#ClipperzBackgroundDIV{width:290px;height:420px;padding:20px%200px%200px%2020px;margin:0px;border:0px;background-color:transparent;background-repeat:no-repeat;position:absolute;z-index:20000;top:40px;left:40px;background-image:url(%22+_2f+%22)}%3C%2fstyle%3E%22;_32+=%22%3Cdiv%20style=%5c%22border:0px;margin:0px;padding:0px;padding-left:10px;%5c%22%3E%22+%22%3Cimg%20style=%5c%22padding-top:5px;%5c%22%20src=%5c%22%22+_2e+%22%5c%22%3E%22+%22%3Ca%20href=%5c%22javascript:closeBookmarklet();%5c%22%3E%22+%22%3Cimg%20style=%5c%22padding-left:28px;padding-bottom:10px;%5c%22%20border=0%20src=%5c%22%22+_30+%22%5c%22%3E%22+%22%3C%2fa%3E%22+%22%3C%2fdiv%3E%22;if((_29!=null)&&(_2a==null)){_32+=%22%3Cdiv%20style=%5c%22width:255px;border-top:1px%20dotted%20%23336;%5c%22%3E%22+%22%3Cdiv%20style=%5c%22line-height:10pt;margin-right:10px;margin-top:5px;padding:5px%2010px;color:%23666;text-align:left;font-family:sans-serif;%5c%22%3E%22+%22%3Cp%20style=%5c%22margin:0px;font-weight:bold;font-size:10pt;font-family:sans-serif;%5c%22%3EHow%20to%20add%20a%20new%20card%20or%20a%20direct%20login%20to%20an%20existing%20card%20for%20this%20website:%3C%2fp%3E%22+%22%3Col%20style=%5c%22padding:0px%200px%200px%2020px;font-size:9pt;font-family:sans-serif;%5c%22%3E%22+%22%3Cli%3ECopy%20the%20content%20of%20the%20text%20area%20below(Ctrl-C)%3C%2fli%3E%22+%22%3Cli%3EGo%20to%20your%20Clipperz%20account%3C%2fli%3E%22+%22%3Cli%3EClick%20%5c%22Add%20new%20card%5c%22%20or%20select%20the%20related%20card%3C%2fli%3E%22+%22%3Cli%3EPaste%20the%20direct%20login%20configuration(Ctrl-V)%3C%2fli%3E%22+%22%3Cli%3EComplete%20and%20review%20the%20details,then%20click%20%5c%22Save%5c%22%3C%2fli%3E%22+%22%3C%2fol%3E%22+%22%3C%2fdiv%3E%22+%22%3C%2fdiv%3E%22;_32+=%22%3Ctextarea%20id=%5c%22bookmarklet_textarea%5c%22%20style=%5c%22border:2px%20solid%20%23333366;font-family:sans-serif;font-size:8pt;color:%23336;width:240px;height:135px;padding:4px;background-color:white;margin:0px%2010px;%5c%22%3E%22+sj(_29)+%22%3C%2ftextarea%3E%22;}else{if((_29==null)&&(_2a==null)){_32+=%22%3Cdiv%3ENo%20login%20form%20has%20been%20found%20on%20the%20page%3C%2fdiv%3E%3Cdiv%3EGet%20some%20help%20%3Ca%20href=%5c%22%23%5c%22%3Ehere%3C%2fa%3E%3C%2fdiv%3E%22;}else{_32+=%22%3Cdiv%3EAn%20error%20happened%20while%20processing%20the%20page%3C%2fdiv%3E%3Cdiv%3EGet%20some%20help%20%3Ca%20href=%5c%22%23%5c%22%3Ehere%3C%2fa%3E%3C%2fdiv%3E%3Cdiv%3E%22+_2a.name+%22%20-%20%22+_2a.message+%22%3C%2fdiv%3E%22;}}_2b.innerHTML=%22%3Cdiv%20id=%5c%22ClipperzBackgroundDIV%5c%22%3E%22+_32+%22%3C%2fdiv%3E%22;document.body.appendChild(_2b);if((_29!=null)&&(_2a==null)){_31=document.getElementById(%22bookmarklet_textarea%22);_31.focus();_31.select();}};getLoginFormConfiguration=function(){var%20_33;try{_33={};_33.page=pp();_33.form=fp(flf(document,0));_33.version=%220.2.3%22;lfp(_33,_cble);}catch(e){lfp(_33,e);}};getLoginFormConfiguration();', 'CrossWindowsBookmarklet_TEST'); + console.log("runBookmarkletScript"); +}; + +init = function () { + MochiKit.Signal.connect('newWindow', 'onclick', newWindow); + MochiKit.Signal.connect('runBookmarkletScript', 'onclick', runBookmarkletScript); +}; + +MochiKit.DOM.addLoadEvent(init); diff --git a/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html new file mode 100644 index 0000000..10e2f2e --- /dev/null +++ b/frontend/gamma/tests/tests/Components/crossWindowsBookmarklet/index.html @@ -0,0 +1,73 @@ + + + + + Cross Window Bookmarklet execution - test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/frontend/gamma/tests/tests/index.html b/frontend/gamma/tests/tests/index.html new file mode 100644 index 0000000..75b8e95 --- /dev/null +++ b/frontend/gamma/tests/tests/index.html @@ -0,0 +1,48 @@ + + + + + Complete TEST suite + + + + + + + \ No newline at end of file diff --git a/properties/license.txt b/properties/license.txt new file mode 100644 index 0000000..11bce99 --- /dev/null +++ b/properties/license.txt @@ -0,0 +1,22 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + +Copyright 2008-2011 Clipperz Srl + +This file is part of Clipperz's Password Manager web application. + +For further information about its features and functionalities please +refer to http://www.clipperz.com + +* Clipperz's Password Manager 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's Password Manager 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 Javascript Crypto Library. If not, see + . \ No newline at end of file diff --git a/scripts/build b/scripts/build new file mode 100755 index 0000000..b17a18f --- /dev/null +++ b/scripts/build @@ -0,0 +1,5 @@ +#!/bin/bash + +readonly CURR_DIR=$(cd "$(dirname "$0")"; pwd -P) + +${CURR_DIR}/builder/main.py $@ \ No newline at end of file diff --git a/scripts/builder/backendBuilder.py b/scripts/builder/backendBuilder.py new file mode 100644 index 0000000..f5dc7b2 --- /dev/null +++ b/scripts/builder/backendBuilder.py @@ -0,0 +1,89 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +import sys, os, json +import shutil +import main +import hashlib + +class BackendBuilder: + + 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): + pass + + def copyCompiledCodeToTargetDir (self): + src = self.sourceFolder() + dst = self.targetFolder() + main.createFolder(os.path.dirname(dst)) + shutil.copytree(src, dst) + + def sourceFolder (self): + return main.projectBaseDir() + '/backend/' + self.relativePath() + '/src' + + + def targetFolder (self): + return self.projectTargetDir + self.relativePath() + + def createTargetFolder (self): + main.createFolder(self.targetFolder()) + + +# def copyFrontendResources (self, frontend): +# print "copying resources for frontend: " + frontend +# print "SETTINGS: " + str(self.settings) + + + def writeToTargetFolder (self, filename, content): + file = open(self.targetFolder() + '/' + filename, 'w') + file.write(content.encode('utf-8')) + file.close() + + + def configureIndexContent (self, indexContent): + result = indexContent + result = result.replace( '@request.path@', self.settings['request.path'] ) + result = result.replace( '@should.pay.toll@', self.settings['should.pay.toll'] ) + + return result + + + def logChecksums (self, content, message): + md5Digest = hashlib.md5(content.encode('utf-8')).hexdigest() + shaDigest = hashlib.sha1(content.encode('utf-8')).hexdigest() + sha256Digest = hashlib.sha256(content.encode('utf-8')).hexdigest() + print message + ": " + md5Digest + " (md5)" + print message + ": " + shaDigest + " (sha1)" + print message + ": " + sha256Digest + " (sha256)" + + + + def run (self): + print self.name() + " - RUN" + + self.compileCode() + self.copyCompiledCodeToTargetDir() + + for frontend in self.frontends: + frontendPath = frontend.module + '/' + if 'debug' in self.versions: + frontend.copyResourcesToTargetFolder(self.targetFolder()) + #self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assembleDebugVersion())) + self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG'))) + + if 'install' in self.versions: + index = self.configureIndexContent(frontend.assemble()) + self.writeToTargetFolder(frontendPath + 'index.html', index) + self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index.html checksum") + diff --git a/scripts/builder/cssmin.py b/scripts/builder/cssmin.py new file mode 100644 index 0000000..32ddf77 --- /dev/null +++ b/scripts/builder/cssmin.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +"""`cssmin` - A Python port of the YUI CSS compressor.""" + + +from StringIO import StringIO # The pure-Python StringIO supports unicode. +import re + + +__version__ = '0.1.4' + + +def remove_comments(css): + """Remove all CSS comment blocks.""" + + iemac = False + preserve = False + comment_start = css.find("/*") + while comment_start >= 0: + # Preserve comments that look like `/*!...*/`. + # Slicing is used to make sure we don"t get an IndexError. + preserve = css[comment_start + 2:comment_start + 3] == "!" + + comment_end = css.find("*/", comment_start + 2) + if comment_end < 0: + if not preserve: + css = css[:comment_start] + break + elif comment_end >= (comment_start + 2): + if css[comment_end - 1] == "\\": + # This is an IE Mac-specific comment; leave this one and the + # following one alone. + comment_start = comment_end + 2 + iemac = True + elif iemac: + comment_start = comment_end + 2 + iemac = False + elif not preserve: + css = css[:comment_start] + css[comment_end + 2:] + else: + comment_start = comment_end + 2 + comment_start = css.find("/*", comment_start) + + return css + + +def remove_unnecessary_whitespace(css): + """Remove unnecessary whitespace characters.""" + + def pseudoclasscolon(css): + + """ + Prevents 'p :link' from becoming 'p:link'. + + Translates 'p :link' into 'p ___PSEUDOCLASSCOLON___link'; this is + translated back again later. + """ + + regex = re.compile(r"(^|\})(([^\{\:])+\:)+([^\{]*\{)") + match = regex.search(css) + while match: + css = ''.join([ + css[:match.start()], + match.group().replace(":", "___PSEUDOCLASSCOLON___"), + css[match.end():]]) + match = regex.search(css) + return css + + css = pseudoclasscolon(css) + # Remove spaces from before things. + css = re.sub(r"\s+([!{};:>+\(\)\],])", r"\1", css) + + # If there is a `@charset`, then only allow one, and move to the beginning. + css = re.sub(r"^(.*)(@charset \"[^\"]*\";)", r"\2\1", css) + css = re.sub(r"^(\s*@charset [^;]+;\s*)+", r"\1", css) + + # Put the space back in for a few cases, such as `@media screen` and + # `(-webkit-min-device-pixel-ratio:0)`. + css = re.sub(r"\band\(", "and (", css) + + # Put the colons back. + css = css.replace('___PSEUDOCLASSCOLON___', ':') + + # Remove spaces from after things. + css = re.sub(r"([!{}:;>+\(\[,])\s+", r"\1", css) + + return css + + +def remove_unnecessary_semicolons(css): + """Remove unnecessary semicolons.""" + + return re.sub(r";+\}", "}", css) + + +def remove_empty_rules(css): + """Remove empty rules.""" + + return re.sub(r"[^\}\{]+\{\}", "", css) + + +def normalize_rgb_colors_to_hex(css): + """Convert `rgb(51,102,153)` to `#336699`.""" + + regex = re.compile(r"rgb\s*\(\s*([0-9,\s]+)\s*\)") + match = regex.search(css) + while match: + colors = map(lambda s: s.strip(), match.group(1).split(",")) + hexcolor = '#%.2x%.2x%.2x' % tuple(map(int, colors)) + css = css.replace(match.group(), hexcolor) + match = regex.search(css) + return css + + +def condense_zero_units(css): + """Replace `0(px, em, %, etc)` with `0`.""" + + return re.sub(r"([\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)", r"\1\2", css) + + +def condense_multidimensional_zeros(css): + """Replace `:0 0 0 0;`, `:0 0 0;` etc. with `:0;`.""" + + css = css.replace(":0 0 0 0;", ":0;") + css = css.replace(":0 0 0;", ":0;") + css = css.replace(":0 0;", ":0;") + + # Revert `background-position:0;` to the valid `background-position:0 0;`. + css = css.replace("background-position:0;", "background-position:0 0;") + + return css + + +def condense_floating_points(css): + """Replace `0.6` with `.6` where possible.""" + + return re.sub(r"(:|\s)0+\.(\d+)", r"\1.\2", css) + + +def condense_hex_colors(css): + """Shorten colors from #AABBCC to #ABC where possible.""" + + regex = re.compile(r"([^\"'=\s])(\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])") + match = regex.search(css) + while match: + first = match.group(3) + match.group(5) + match.group(7) + second = match.group(4) + match.group(6) + match.group(8) + if first.lower() == second.lower(): + css = css.replace(match.group(), match.group(1) + match.group(2) + '#' + first) + match = regex.search(css, match.end() - 3) + else: + match = regex.search(css, match.end()) + return css + + +def condense_whitespace(css): + """Condense multiple adjacent whitespace characters into one.""" + + return re.sub(r"\s+", " ", css) + + +def condense_semicolons(css): + """Condense multiple adjacent semicolon characters into one.""" + + return re.sub(r";;+", ";", css) + + +def wrap_css_lines(css, line_length): + """Wrap the lines of the given CSS to an approximate length.""" + + lines = [] + line_start = 0 + for i, char in enumerate(css): + # It's safe to break after `}` characters. + if char == '}' and (i - line_start >= line_length): + lines.append(css[line_start:i + 1]) + line_start = i + 1 + + if line_start < len(css): + lines.append(css[line_start:]) + return '\n'.join(lines) + + +def cssmin(css, wrap=None): + css = remove_comments(css) + css = condense_whitespace(css) + # A pseudo class for the Box Model Hack + # (see http://tantek.com/CSS/Examples/boxmodelhack.html) + css = css.replace('"\\"}\\""', "___PSEUDOCLASSBMH___") + css = remove_unnecessary_whitespace(css) + css = remove_unnecessary_semicolons(css) + css = condense_zero_units(css) + css = condense_multidimensional_zeros(css) + css = condense_floating_points(css) + css = normalize_rgb_colors_to_hex(css) + css = condense_hex_colors(css) + if wrap is not None: + css = wrap_css_lines(css, wrap) + css = css.replace("___PSEUDOCLASSBMH___", '"\\"}\\""') + css = condense_semicolons(css) + return css.strip() + + +def main(): + import optparse + import sys + + p = optparse.OptionParser( + prog="cssmin", version=__version__, + usage="%prog [--wrap N]", + description="""Reads raw CSS from stdin, and writes compressed CSS to stdout.""") + + p.add_option( + '-w', '--wrap', type='int', default=None, metavar='N', + help="Wrap output to approximately N chars per line.") + + options, args = p.parse_args() + sys.stdout.write(cssmin(sys.stdin.read(), wrap=options.wrap)) + + +if __name__ == '__main__': + main() diff --git a/scripts/builder/frontendBuilder.py b/scripts/builder/frontendBuilder.py new file mode 100644 index 0000000..b796438 --- /dev/null +++ b/scripts/builder/frontendBuilder.py @@ -0,0 +1,398 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +import sys, os, re +import cssmin +import jsmin +import codecs +import shutil +import StringIO +import urllib + +#from mercurial import ui, hg +#from mercurial.node import hex +from dulwich.repo import Repo + +import main + + + +class FrontendBuilder: + + def __init__ (self, frontend, settings): + 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.processedFiles = {} + + + def mercurialRepositoryVersion (self): + repo = hg.repository(ui.ui(), self.projectDir) + context = repo['tip'] + result = str(context) + + return result + + + def gitRepositoryVersion (self): + repo = Repo(self.projectDir) + #if repo.is_dirty(): + # print "WARNING: build run with dirty repository" + result = repo.refs['HEAD'] + + return result + + + + def repositoryVersion (self): + cacheKey = 'repositoryVersion' + if not self.processedFiles.has_key(cacheKey): + #result = self.mercurialRepositoryVersion() + result = self.gitRepositoryVersion() + self.processedFiles[cacheKey] = result + else: + result = self.processedFiles[cacheKey] + + return result + + + #def relativePath (self): + # return self.module + # + + def log (self, message): + print "frontend [" + self.module + "]: " + message + + + def absolutePathForSourceFile (self, folder, basePath, file): + return folder + '/frontend/' + self.module + '/' + basePath + '/' + file + + + def absolutePathForTargetFile (self, folder, basePath, file): + return 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): + for file in self.filterFiles(self.settings[fileType]): + src = self.absolutePathForSourceFile(sourceFolder, fileType, file) + dst = self.absolutePathForTargetFile(destinationFolder, fileType, file) + main.createFolder(os.path.dirname(dst)) + shutil.copy2(src, dst) + + + def copyResourcesToTargetFolder (self, targetFolder): + self.copyResources(self.projectDir, targetFolder, 'css') + self.copyResources(self.projectDir, targetFolder, 'js') + + + def loadFilesContent (self, basePath, files): + result = "" + + for file in self.filterFiles(files): + try: + fileHandler = codecs.open(self.absolutePathForSourceFile(self.projectDir, 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']) + + 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): + self.log("compressing JS 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): + # 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): + return self.compressJS_jsmin(js) + #return self.compressJS_closureCompiler(js) + + + #========================================================================== + + def packBookmarklet (self, bookmakeletCode): + 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) + + 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) + +# + 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'])) + '";bookmarklet_ie="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet_IE.js'])) + '";' + self.processedFiles[cacheKey] = result + else: + result = self.processedFiles[cacheKey] + + return result + + + def replaceTemplatePlaceholders (self, assemblyMode, pageTitle, copyright, css, code, version, versionType): + result = self.template() + + result = result.replace('@page.title@', pageTitle, 1) + result = result.replace('@copyright@', copyright, 1) + result = result.replace('@css@', css, 1) + #result = result.replace('@bookmarklet@', bookmarklet, 1) + result = result.replace('@application.version@', version, 1) + result = result.replace('@application.version.type@', versionType, 1) + result = result.replace('@js_' + assemblyMode + '@', code, 1) + + 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): + # + return '\n'.join(map(lambda file: '', files)) + + + def cssTagForContent (self, content): + return '' + + + def scriptTagsForFiles (self, basePath, files): + # + return '\n'.join(map(lambda file: '', files)) + + + def scriptTagForContent (self, content): + return '' + + + def assembleVersion (self, assemblyMode, pageTitle, copyright, css, js, version, versionType): + cacheKey = version + "-" + versionType + if not self.processedFiles.has_key(cacheKey): + result = self.replaceTemplatePlaceholders(assemblyMode, pageTitle, copyright, css, js, 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'): + pageTitle = "Clipperz - " + self.module + if versionType != 'LIVE': + pageTitle += " [" + versionType + " - " + assemblyMode +"]" + + if assemblyMode == 'INSTALL': + 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']))) + else: + css = self.cssTagsForFiles('css', self.filterFiles(self.settings['css'])) + js = self.scriptTagForContent(self.bookmarklet()) + '\n' + self.scriptTagsForFiles('js', self.filterFiles(self.settings['js'])) + + return self.assembleVersion( + assemblyMode = assemblyMode, + pageTitle = pageTitle, + copyright = self.assembleCopyrightHeader(), + css = css, + js = js, + version = self.repositoryVersion(), + versionType = versionType + ) + + + + diff --git a/scripts/builder/jsmin.py b/scripts/builder/jsmin.py new file mode 100644 index 0000000..91d6307 --- /dev/null +++ b/scripts/builder/jsmin.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os, os.path, shutil + +# This code is original from jsmin by Douglas Crockford, it was translated to +# Python by Baruch Even. The original code had the following copyright and +# license. +# +# /* jsmin.c +# 2007-05-22 +# +# Copyright (c) 2002 Douglas Crockford (www.crockford.com) +# +# 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 shall be used for Good, not Evil. +# +# 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. +# */ + +from StringIO import StringIO + +def jsmin(js): + ins = StringIO(js) + outs = StringIO() + JavascriptMinify().minify(ins, outs) + str = outs.getvalue() + if len(str) > 0 and str[0] == '\n': + str = str[1:] + return str + +def isAlphanum(c): + """return true if the character is a letter, digit, underscore, + dollar sign, or non-ASCII character. + """ + return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or + (c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126)); + +class UnterminatedComment(Exception): + pass + +class UnterminatedStringLiteral(Exception): + pass + +class UnterminatedRegularExpression(Exception): + pass + +class JavascriptMinify(object): + + def _outA(self): + self.outstream.write(self.theA) + def _outB(self): + self.outstream.write(self.theB) + + def _get(self): + """return the next character from stdin. Watch out for lookahead. If + the character is a control character, translate it to a space or + linefeed. + """ + c = self.theLookahead + self.theLookahead = None + if c == None: + c = self.instream.read(1) + if c >= ' ' or c == '\n': + return c + if c == '': # EOF + return '\000' + if c == '\r': + return '\n' + return ' ' + + def _peek(self): + self.theLookahead = self._get() + return self.theLookahead + + def _next(self): + """get the next character, excluding comments. peek() is used to see + if an unescaped '/' is followed by a '/' or '*'. + """ + c = self._get() + if c == '/' and self.theA != '\\': + p = self._peek() + if p == '/': + c = self._get() + while c > '\n': + c = self._get() + return c + if p == '*': + c = self._get() + while 1: + c = self._get() + if c == '*': + if self._peek() == '/': + self._get() + return ' ' + if c == '\000': + raise UnterminatedComment() + + return c + + def _action(self, action): + """do something! What you do is determined by the argument: + 1 Output A. Copy B to A. Get the next B. + 2 Copy B to A. Get the next B. (Delete A). + 3 Get the next B. (Delete B). + action treats a string as a single character. Wow! + action recognizes a regular expression if it is preceded by ( or , or =. + """ + if action <= 1: + self._outA() + + if action <= 2: + self.theA = self.theB + if self.theA == "'" or self.theA == '"': + while 1: + self._outA() + self.theA = self._get() + if self.theA == self.theB: + break + if self.theA <= '\n': + raise UnterminatedStringLiteral() + if self.theA == '\\': + self._outA() + self.theA = self._get() + + + if action <= 3: + self.theB = self._next() + if self.theB == '/' and (self.theA == '(' or self.theA == ',' or + self.theA == '=' or self.theA == ':' or + self.theA == '[' or self.theA == '?' or + self.theA == '!' or self.theA == '&' or + self.theA == '|' or self.theA == ';' or + self.theA == '{' or self.theA == '}' or + self.theA == '\n'): + self._outA() + self._outB() + while 1: + self.theA = self._get() + if self.theA == '/': + break + elif self.theA == '\\': + self._outA() + self.theA = self._get() + elif self.theA <= '\n': + raise UnterminatedRegularExpression() + self._outA() + self.theB = self._next() + + + def _jsmin(self): + """Copy the input to the output, deleting the characters which are + insignificant to JavaScript. Comments will be removed. Tabs will be + replaced with spaces. Carriage returns will be replaced with linefeeds. + Most spaces and linefeeds will be removed. + """ + self.theA = '\n' + self._action(3) + + while self.theA != '\000': + if self.theA == ' ': + if isAlphanum(self.theB): + self._action(1) + else: + self._action(2) + elif self.theA == '\n': + if self.theB in ['{', '[', '(', '+', '-']: + self._action(1) + elif self.theB == ' ': + self._action(3) + else: + if isAlphanum(self.theB): + self._action(1) + else: + self._action(2) + else: + if self.theB == ' ': + if isAlphanum(self.theA): + self._action(1) + else: + self._action(3) + elif self.theB == '\n': + if self.theA in ['}', ']', ')', '+', '-', '"', '\'']: + self._action(1) + else: + if isAlphanum(self.theA): + self._action(1) + else: + self._action(3) + else: + self._action(1) + + def minify(self, instream, outstream): + self.instream = instream + self.outstream = outstream + self.theA = '\n' + self.theB = None + self.theLookahead = None + + self._jsmin() + self.instream.close() + +def compress(in_files, out_file, in_type='js', verbose=False, temp_file='.temp'): + temp = open(temp_file, 'w') + for f in in_files: + fh = open(f) + data = fh.read() + '\n' + fh.close() + + temp.write(data) + + print ' + %s' % f + temp.close() + + out = open(out_file, 'w') + + jsm = JavascriptMinify() + jsm.minify(open(temp_file,'r'), out) + + out.close() + + org_size = os.path.getsize(temp_file) + new_size = os.path.getsize(out_file) + + print '=> %s' % out_file + print 'Original: %.2f kB' % (org_size / 1024.0) + print 'Compressed: %.2f kB' % (new_size / 1024.0) + print 'Reduction: %.1f%%' % (float(org_size - new_size) / org_size * 100) + print '' + + os.remove(temp_file) \ No newline at end of file diff --git a/scripts/builder/main.py b/scripts/builder/main.py new file mode 100755 index 0000000..ba0c72a --- /dev/null +++ b/scripts/builder/main.py @@ -0,0 +1,166 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +import sys, os, json +import shutil +import pprint +import frontendBuilder +import codecs +import itertools + +from collections import deque +from phpBuilder import PhpBuilder +from pythonBuilder import PythonBuilder + +pp = pprint.PrettyPrinter(indent=4, depth=4) + +#-------------------------------------------------------------------- + +def scriptDir (): + return os.path.dirname(sys.argv[0]) + +def projectBaseDir (): + return os.path.abspath(scriptDir() + '/../..') + +def projectTargetDir(): + return projectBaseDir() + '/target/' + +#-------------------------------------------------------------------- + +def createFolder (path): + if not os.path.exists(path): + os.makedirs(path) + +#-------------------------------------------------------------------- + +def loadSettings (component, module): + print "MODULE: " + module + + if '.' in module: + moduleComponents = module.split('.') + module = moduleComponents[0] + submodule = moduleComponents[1] + else: + submodule = module + + settings = codecs.open(projectBaseDir() + '/' + component + '/' + module + '/properties/' + submodule + '.properties.json', 'r', 'utf-8') + result = json.load(settings) + settings.close + + return result + +#==================================================================== +# +# def assembleFrontend (frontend, versions): +# result = {} +# settings = loadSettings('frontend', frontend) +# builder = frontendBuilder.FrontendBuilder(frontend, settings, projectBaseDir()) +# +# for version in versions: +# if version == 'install': +# result[version] = builder.assembleInstallVersion() +# elif version == 'debug': +# result[version] = builder.assembleDebugVersion() +# else: +# raise Exception('unrecognized version: ' + version) +# +# return result +# +#==================================================================== + +def assembleBackend (backend, frontends, versions): + settings = loadSettings('backend', backend) + + if backend == 'php': + backendBuilder = PhpBuilder(projectTargetDir(), frontends, versions, settings) + elif backend == 'python': + backendBuilder = PythonBuilder(projectTargetDir(), frontends, versions, settings) + #elif backend == 'java': + # buildJavaBackend (frontends, versions, settings) + else: + raise Exception('unrecognized backend: ' + backend) + + backendBuilder.run() + +#==================================================================== + +def build (settings): + frontends = [] + + for frontend in settings['frontends']: + frontends.append(frontendBuilder.FrontendBuilder(frontend, loadSettings('frontend', frontend))) + + for backend in settings['backends']: + assembleBackend(backend, frontends, settings['versions']) + +#-------------------------------------------------------------------- + +def clean (): + print "cleaning up …" + if os.path.exists(projectTargetDir()): + shutil.rmtree(projectTargetDir()) + +#-------------------------------------------------------------------- + +def usage (message): + if message != None: + print "ERROR: " + message + + print + print "build.py clean" + print "build.py clean install" + print "build.py install --ALL" + print "build.py install debug --ALL" + print "build.py clean install debug --ALL" + print "build.ph install, debug --backends php java --frontends beta gamma" + print "build.ph install, debug --backends php java --frontends beta gamma gamma.mobile" + exit(1) + +#-------------------------------------------------------------------- + +def main (): + settings = {} + parameters = list(itertools.islice(sys.argv, 1, None)) + + shouldClean = len(filter(lambda x: x == 'clean', parameters)) > 0 + if (shouldClean): + clean () + + parameters = filter(lambda x: x != 'clean', parameters) + versions = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters)) + settings['versions'] = versions; #['debug', 'install'] + parameters = deque(itertools.dropwhile(lambda x: not x.startswith('--'), parameters)) + + if len(parameters) > 0: + parameter = parameters.popleft() + if parameter == "--ALL": + settings['frontends'] = ['beta', 'gamma', 'mobile'] + settings['backends'] = ['php', 'python', 'java'] + else: + while parameter != None: + values = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters)) + + if parameter == "--backends": + settings['backends'] = values + elif parameter == "--frontends": + settings['frontends'] = values + + parameters = deque(itertools.dropwhile(lambda x: not x.startswith('--'), parameters)) + if parameters: + parameter = parameters.popleft() + else: + parameter = None + + if (not settings.has_key('versions')): + usage("missing 'versions'") + if (not settings.has_key('frontends')): + usage("missing 'frontends'") + if (not settings.has_key('backends')): + usage("missing 'backends'") + + build (settings) + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/builder/phpBuilder.py b/scripts/builder/phpBuilder.py new file mode 100644 index 0000000..9512192 --- /dev/null +++ b/scripts/builder/phpBuilder.py @@ -0,0 +1,14 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +from backendBuilder import BackendBuilder + +class PhpBuilder(BackendBuilder): + + def name(self): + return "PHP builder" + + def relativePath(self): + return 'php' + + diff --git a/scripts/builder/pythonBuilder.py b/scripts/builder/pythonBuilder.py new file mode 100644 index 0000000..44c62a8 --- /dev/null +++ b/scripts/builder/pythonBuilder.py @@ -0,0 +1,14 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +from backendBuilder import BackendBuilder + +class PythonBuilder(BackendBuilder): + + def name(self): + return "Python builder" + + def relativePath(self): + return 'python' + + From 487ddcfed5caafbaed1770ab0696cd608b36e4a0 Mon Sep 17 00:00:00 2001 From: Clipperz Date: Mon, 3 Oct 2011 17:57:13 +0200 Subject: [PATCH 3/3] Expanded the README.md file Reintroduced the Community Edition naming. Added more verbose explanations. Added an hint to the Workgroup Edition. Rename all "licence" occurrences to "license". --- LICENCE.txt => LICENSE.txt | 0 README.md | 88 +++++++++++++++++++++++++++----------- 2 files changed, 62 insertions(+), 26 deletions(-) rename LICENCE.txt => LICENSE.txt (100%) diff --git a/LICENCE.txt b/LICENSE.txt similarity index 100% rename from LICENCE.txt rename to LICENSE.txt diff --git a/README.md b/README.md index be11d8c..4a7bc47 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,93 @@ -# Clipperz Password Manager # - -This is the code of [Clipperz][clipperz] [Password Manager][password-manager] - -More details - -ALL the code included in this project, if not otherwise stated, is released with -the AGPL licence (see LICENCE.txt), and all rights are reserved to Clipperz src. +# ![Clipperz icon][icon] Clipperz Password Manager - COMMUNITY EDITION -## CONTRIBUTIONS ## +[Clipperz Community Edition][CE] allows you to host on your own server a web service identical to [Clipperz online password manager][clipperz]. It supports multiple backends (PHP/MySQL, Python/AppEngine, …) and you can contribute your own. -Clipperz is very interested in accepting patches in the form of pull requests, but in -order to avoid jeopardizing the ownership of the code base, we will require every -developer to sign Clipperz [Contribution Agreement][contributor-agreement] +Please note that Clipperz Community Edition is not suitable for mass deployments since it lacks several critical capabilities such as bot protection. If you want to offer Clipperz password manager to a wide audience, please wait for the upcoming Provider Edition. + +In any case if you want to use Clipperz’s software in a commercial, for-profit environment, please contact us to inquire about licensing options for commercial applications. + +ALL the code included in this project, if not otherwise stated, is released with the **AGPL v.3 license** (see `LICENSE.txt`), and all rights are reserved to Clipperz Srl. -## BUILDING ## +## Why a Community Edition + +But why would you prefer running Clipperz Community Edition from your own server instead of using the free and anonymous online service provided by its developers? + +* “Clipperz security architecture is great, but I prefer to store my data on my hardware. I just feel better this way!” +* “Clipperz is cool, but it would be even cooler it it had a Scala backend. I'm going to write it!" +* “I would like to modify the look & feel of Clipperz and embed this powerful password manager within my family intranet.” +* “Clipperz works nicely, but I would love to play with the source code in order to improve feature X and add new features Y and Z.” +* … + +Whatever is your motivation, we would love to hear from you about how and where you use Clipperz Community Edition. [Get in contact!][contact] + + +## Warnings + +Please note that Clipperz Community Edition 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 cuncurrent sessions management. + + +## Community Edition vs Workgroup Edition + +This Community Edition is aimed to **individual users**, but you may be interested to know that we are working on a **Workgroup Edition** targeting organizations that need a +password manager for their workforce (creating and managing employees accounts, defining groups and sharing policies, ...). + +The Workgroup Edition development is quite challenging and, while the overall design is already in place, it will still require a fairly large amount of resources for analysis and implementation. + +If your organization is interested in such edition, you can subscribe a "pledge" to sustain its development in exchange for a very generous user license with unlimited upgrades and other benefits. Again, [get in contact][contact]! + + +## Contributions + +Your contributions to Clipperz Community Edition 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: ./scripts/build clean install debug --frontends beta --backends php - The output will be available in the `target` folder, with a separate folder for each build backend (initially this will be just a `php` folder). The script, invoked with these parameters, will build both the full version (`install` -> index.html) and the debug version (index_debug.html) of the /beta frontend using the PHP backend. -At the moment this is the only combination that (kind of) works, but this script will be gradually extended to be able to build also the /gamma frontend (whose code is already in the repository) and possibly also other backends (Python AppEngine being the very first candidate, and a JavaScript version per node.js another interesting option) +At the moment this is the only combination that works, but this script will be gradually extended to be able to build also the [/gamma frontend][gamma] (whose code is already in the repository) and possibly also other backends (Python AppEngine being the very first candidate, and a Javascript version per node.js another interesting option) -## INSTALLING ## +## Installing -### PHP + MySQL backend ### +### PHP + MySQL backend At the moment the only backend that the build script can successfully create is the PHP + MySQL one. -#### PHP #### +#### 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 #### +#### 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:////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 bilding the PHP backend may be found in the `doc/install.php.txt` file. +More information about building the PHP backend may be found in the `doc/install.php.txt` file. -## WARNING ## +## Disclaimer The resulting application has not been fully tested, so there may be still problems due to the new build script or some other changes that were done due to the new repository structure. So, for the moment, **use it at your own risk!** - -[clipperz]: http://www.clipperz.com -[password-manager]: https://www.clipperz.com/beta -[contributor-agreement]: http://www.clipperz.com/open_source/contributor_agreement -[pog]: http://www.phpobjectgenerator.com/ \ No newline at end of file +[icon]: http://0.gravatar.com/avatar/2a9fae49ced80a42830a206f88ea1022?size=100 +[CE]: http://clipperz.com/open_source/clipperz_community_edition +[clipperz]: http://www.clipperz.com +[contact]: http://clipperz.com/contact +[CA]: http://www.clipperz.com/open_source/contributor_agreement +[pog]: http://www.phpobjectgenerator.com/ \ No newline at end of file